次の形式のファイルが2つあります。
ファイル1:
air
smell
hand
dude
road
cat
ファイル2:
air,4,21,01,13,3,2
smell,21,4,2,5,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
hand,1,4,2,1,6
mouse,1,3,5,6,2
私がしたいのは、ファイル2の列1の最初の文字列がファイル1にある場合は、ファイル2の行全体を印刷してファイル1の順序を維持したいと思います。
予想出力:
air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
答え1
これにより、トリックを実行できます。
awk -F, 'FNR==NR {a[$1]; next}; $1 in a' file1 file2
編集する:
無効な注文文書の説明です。新しい試み(gawk
許可されている場合は必須)
gawk -F, '
FNR==NR {a[NR]=$1; next};
{b[$1]=$0}
END{for (i in a) if (a[i] in b) print b[a[i]]}
' file1 file2
編集2:
nowmalawk
ファイルとスワップファイルを使用してください。
awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file2 file1
答え2
join -t, -1 2 -2 1 <(nl -s, -ba -nrz file1 | sort -t, -k2) \
<(sort -t, -k1 file2) | sort -t, -k2 | cut -d, -f1,3-
の行にはfile1
番号が付けられ、結果はsort
2番目のフィールドで編集されます。次に、次join
のように編集しますfile2
(sort
最初のフィールドで編集)。
air,000001,4,21,01,13,3,2
cat,000006,1,5,6,3,1
dude,000004,1,31,42,1
hand,000003,1,4,2,1,6
road,000005,1,4,2,1,4
smell,000002,21,4,2,5,6
次に、sort
2番目のフィールド(つまり行番号)の結果を編集して元の行の順序を復元し、次を使用して同じ2番目のフィールドを削除しますcut
。
air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
答え3
単純なgrepコマンドを使用できます。
grep -f file1 file2