次のように、タブで区切られた値を持つ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