我有一个文件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 awk
awk
无论您安装的具体风格如何,都会给您一个很好的介绍。如果您在冲浪后仍有疑问,请询问具体信息。
我敢打赌有人会找到一种方法让这看起来更简单。 ;-)
答案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