両方のファイルで特定の列の共通要素を見つけ、各ファイルの列値を出力します。

両方のファイルで特定の列の共通要素を見つけ、各ファイルの列値を出力します。

次のように、タブで区切られた値を持つ2つのファイルがあります。

ファイル1:

A    1
B    3
C    1
D    4

ファイル2:

E    1
B    3
C    2
A    9

列1に同じ文字列を持つファイル1とファイル2の間の行を見つけて、その値を取得したいと思います。必要な出力は、次のような単一ファイルです。

B    3    3
C    1    2
A    1    9

Unix one-linerでこれは可能ですか?

答え1

join結果の行順序が関連しない場合、GNU coreutilsには必要な操作を正確に実行するコマンドが含まれています。

join <(sort file1) <(sort file2)

A 1 9
B 3 3
C 1 2

タブを復元するには:

join <(sort file1) <(sort file2) | tr ' ' '\t'

A   1   9
B   3   3
C   1   2

またはtオプションを使用してくださいjoin

<()別名プロセスの交換、ksh93(この機能のソース)、bashまたはzshが必要)

答え2

ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2

出力にタブ文字を使用するには:

sort -k1 file2 | join -t "        " file1 -

CTRL-Vを押して引用符内にタブを作成できます<tab>

答え3

awkは、出力をソートせずにfile2と同じ順序でソートしたい場合に最適なツールです。

awk '
    NR == FNR {val[$1]=$2; next} 
    $1 in val {print $1, val[$1], $2}
' file1 file2

関連情報