web-dev-qa-db-ja.com

2つのファイルから特定の列の共通要素を検索し、各ファイルから列の値を出力します

次のようなタブ区切りの値を持つ2つのファイルがあります。

file1:

A    1
B    3
C    1
D    4

file2:

E    1
B    3
C    2
A    9

列1の文字列が同じであるファイル1と2の間の行を見つけて、対応する値を取得したいと思います。目的の出力は、次のような単一のファイルです。

B    3    3
C    1    2
A    1    9

これはUnixワンライナーで実行できますか?

3
turtle

GNU coreutilsには、結果の行の並べ替えが関係ない場合に必要なことを正確に実行するコマンドjoinが含まれています。

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が必要)

10
jaume
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>を押すと、引用符の中にタブを作成できます。

2
ire_and_curses

出力をソートしたくないが、代わりにfile2と同じ順序にする場合は、awkを使用するのが適切なツールです。

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