![比较两个文件的第一列,如果第一列匹配,则打印第二个文件的整行](https://linux22.com/image/69100/%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E7%AC%AC%E4%B8%80%E5%88%97%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%AC%AC%E4%B8%80%E5%88%97%E5%8C%B9%E9%85%8D%EF%BC%8C%E5%88%99%E6%89%93%E5%8D%B0%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E6%95%B4%E8%A1%8C.png)
我有两个以下格式的文件:
文件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 中找到文件 2 第 1 列中的第一个字符串,并且我想保留文件 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:
使用 nowmal awk
,并交换文件:
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
在第二个字段中编辑。然后将其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
编辑到第二个字段(即行号)以恢复原始行顺序,然后使用以下命令删除相同的第二个字段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