古い記事
ランダムジャンプ
新しい記事
説明用のメモ。
ファイルは事前にソートされていることが必須。
詳しくは "man join" で。

  • サンプルファイル: a1, a2
    a 11
    b 12
    c 13
    d 14
    e 15
    f 16
    g 17
    
    b 21
    c 22
    e 23
    g 24
    x 25
    y 25
    z 27
    
  • INNER JOIN : それぞれのファイルの第1カラムをキーにJOIN
    join -1 1 -2 1 -t' ' a1 a2
    b 12 21
    c 13 22
    e 15 23
    g 17 24
    
  • LEFT JOIN (-a)
    join -a 1 -1 1 -2 1 -t' ' a1 a2
    a 11
    b 12 21
    c 13 22
    d 14
    e 15 23
    f 16
    g 17 24
    
  • RIGHT JOIN
    join -a 2 -1 1 -2 1 -t' ' a1 a2
    b 12 21
    c 13 22
    e 15 23
    g 17 24
    x 25
    y 25
    z 27
    
  • OUTER JOIN
    join -a 1 -a 2 -1 1 -2 1 -t' ' a1 a2
    a 11
    b 12 21
    c 13 22
    d 14
    e 15 23
    f 16
    g 17 24
    x 25
    y 25
    z 27
    
  • 片方にしかないやつを出す (-v)
    join -v 1 -j 1 -t' ' a1 a2
    a 11
    d 14
    f 16
    
    join -v 1 -v 2 -j 1 -t' ' a1 a2
    a 11
    d 14
    f 16
    x 25
    y 25
    z 27
    
  • サンプル2 (カラム追加): a11, a12
    a 11 1
    b 12
    c 13 1
    e 15
    
    b 21 1
    c 22 1
    e 23
    z 27
    
  • 出力カラムの選択
    join -o 0 -1 1 -2 1 -t' ' a11 a22
    b
    c
    e
    
    join -o "0,2.2,1.2" -1 1 -2 1 -t' ' a11 a22
    b 21 12
    c 22 13
    e 23 15
    
    join -a 1 -a 2 -o 0 1.3 2.3 1.2 2.2 -1 1 -2 1 -t' ' a11 a22
    a 1  11 
    b  1 12 21
    c 1 1 13 22
    e   15 23
    z    27
    
  • 空のときに出す文字列を指定 (-e)
    join -e 'N/A' -a 1 -a 2 -o 0 1.3 2.3 1.2 2.2 -1 1 -2 1 -t' ' a11 a22
    a 1 N/A 11 N/A
    b N/A 1 12 21
    c 1 1 13 22
    e N/A N/A 15 23
    z N/A N/A N/A 27
    
    join -e 0 -o 0 1.3 2.3 -1 1 -2 1 -t' ' a11 a22
    b 0 1
    c 1 1
    e 0 0
    
  • 両方のファイルで同じカラムを使うとき (-j)
    join -e 0 -o 0 1.3 2.3 -j 1 -t' ' a11 a22
    b 0 1
    c 1 1
    e 0 0
    
  • カラム指定 (-1, -2, -j) はそもそも第1カラムを使うときは省略可
    join -t' ' a1 a2
    join -e 0 -o 0 1.3 2.3 -t' ' a11 a22
    
  • 区切り文字指定 (-t): デフォルトはスペース(タブ含む)
    join -j 1 -t$'\t' a.tsv b.tsv
    join -j 1 -t, a.csv b.csv
    
この記事に言及しているこのブログ内の記事