次のようなタブ区切りの値を持つ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ワンライナーで実行できますか?
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が必要)
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>
を押すと、引用符の中にタブを作成できます。
出力をソートしたくないが、代わりにfile2と同じ順序にする場合は、awkを使用するのが適切なツールです。
awk '
NR == FNR {val[$1]=$2; next}
$1 in val {print $1, val[$1], $2}
' file1 file2