web-dev-qa-db-ja.com

2つのファイルの最初の列を比較し、最初の列が一致する場合は2番目のファイルの行全体を印刷する

これらの形式のファイルが2つあります。

file1:

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
4
Nolohice

これはそれを行うはずです:

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:

Nowmal awkを使用して、ファイルを入れ替えます:

awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file2 file1
3
joepd
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の行には番号が付けられ、結果は2番目のフィールドでsortedになります。次に、これはjoinedとfile2(最初のフィールドではsorted)になります。

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

次に、結果は2番目のフィールド(つまり、行番号)でsortedされ、元の行の順序が復元されます。次に、同じ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
don_crissti

単純なgrepコマンドを使用できます。

grep -f file1 file2
0
Venkat Madhav