如何根据不同文件中的键值从文件中删除行

如何根据不同文件中的键值从文件中删除行

我有一个文件1:

1   a   aa
2   b   bb
3   a   aa
4   b   bb
5   a   aa
6   b   bb
7   a   aa
8   b   bb

和文件2:

1
2
5

我需要删除 file1 中的所有行,其中 column1 中的值在 file2 中找到

答案1

sort -b假设两个文件在第一列上按字典顺序排序(例如):

$ join -v 1 file1 file2
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

这使用该join实用程序提取file1第一列与 中的任何值都不匹配的所有行file2

默认行为join是根据两个文件的第一列生成 INNER JOIN,但-v 1我们从第一个文件中获取不可配对的行。

答案2

用 GNU 试试这个awk

解决方案1:

$ awk 'NR==FNR {a[$0]} FNR!=NR {printf("%s",!($1 in a)? $0"\n": "")}' file2 file1
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

第一个解决方案看起来不必要地做作,在块!($1 in a)? $0"\n": ""内有一个三元运算符printf。我只是出于一般性的目的而提出它,这意味着如果您不只是根据您的方案删除不需要的行,而是想将它们替换为my_string,您可以将其放入my_string\n空字符串""

解决方案2:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a) {print $0}' file2 file1

可以进一步简化为:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a)' file2 file1

因为默认awk打印整个记录 ( ) 。$0

man awkawk无论您安装的具体风格如何,都会给您一个很好的介绍。如果您在冲浪后仍有疑问,请询问具体信息。

我敢打赌有人会找到一种方法让这看起来更简单。 ;-)

答案3

awk 'NR==FNR{a[$1];next}!($1 in a){print $0}' file2 file1

输出

3   a   aa
4   b   bb
6   b   bb
7   a   aa
8   b   bb

相关内容