Shell 将两个文件与awk或sed进行比较

Shell 将两个文件与awk或sed进行比较,shell,text,sed,awk,Shell,Text,Sed,Awk,这对你来说一定很容易 这里是file1(一列) 这里是file2(两列) 必须有一个简单的一行程序来打印文件1中与文件2不匹配的行您可以通过组合cut和comm: cut -d' ' -f1 file2 | comm -13 - file1 您也可以考虑“代码>连接< /代码>,这取决于您希望如何处理重复的行。 awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file2 file1 或者使用join和-v,正如@Michael所建议的: join -v1 fi

这对你来说一定很容易

这里是file1(一列)

这里是file2(两列)


必须有一个简单的一行程序来打印文件1中与文件2不匹配的行

您可以通过组合
cut
comm

cut -d' ' -f1 file2 | comm -13 - file1

您也可以考虑“代码>连接< /代码>,这取决于您希望如何处理重复的行。

 awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file2 file1
或者使用join和-v,正如@Michael所建议的:

join -v1 file1 file2
两者都将打印:

1
5
6
7
9

此sed解决方案可能适合您:

{ seq 1 10; echo -e "2 yay\n3 ups\n4 wow\n8 hey"; } | sort -n | 
sed '1{h;d};H;${x;s/\(\S\+\)\n\1[^\n]*\n//g;p};d'
1
5
6
7
9
10

说明:对文件进行数字排序,然后使用
sed
slurp将文件放入保留空间(HS)。在文件结束时,将文件交换到HS,然后使用重复键删除行。

请注意,
join
comm
解决方案要求对输入文件进行排序,它们恰好在这个问题中。
awk
解决方案不关心是否未排序。请您解释一下您的awk一行代码+1?:)@Jaypal数组中的awk保存文件2,索引为field1;然后,对于file1中的每一行,检查它是否是数组的索引,以进行比较。++没有什么特别之处,只是为元素设置了一个值。a[$1]=1;也行。但是,++打字速度更快。:)
1
5
6
7
9
{ seq 1 10; echo -e "2 yay\n3 ups\n4 wow\n8 hey"; } | sort -n | 
sed '1{h;d};H;${x;s/\(\S\+\)\n\1[^\n]*\n//g;p};d'
1
5
6
7
9
10