比较两个文件的第一列,如果第一列匹配,则打印第二个文件的整行

比较两个文件的第一列,如果第一列匹配,则打印第二个文件的整行

我有两个以下格式的文件:

文件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编辑为file2sort在第一个字段上编辑):

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

相关内容