我有一个名为 someNumbers.txt 的文件,其中数字由制表符分隔,例如:
1 1
2 1
5 1
7 1
10 1
我想在另一个包含数字的文件的第一列中搜索 someNumbers.txt 第一列中的数字,例如 EvenNumbers.txt:
2 1
4 1
6 1
8 1
10 1
我想要的输出是:
2 1
10 1
在更简单的场景中, someNumbers.txt 是:
1
2
5
7
10
EvenNumbers.txt 是:
2
4
6
8
10
我可以简单地做
grep -f someNumbers.txt evenNnumbers.txt
并得到输出:
2
10
如果文件是制表符分隔的,我该怎么办?谢谢
答案1
对于逻辑由列定义的情况,有时使用awk
默认解析行并拆分为字段会更简单。因此您不需要匹配行的开头或关心空格。这个例子:
grep -Ff file2 file1
可以写成:
awk 'FNR==NR{map[$0]; next} $0 in map' file2 file1
对于每个文件有两列并且想要修改上述内容的情况,只考虑每个文件的第一列,这非常简单,而不是$0
查找第一个字段 ( ) 的整行 ( $1
):
awk 'FNR==NR{map[$1]; next} $1 in map' file2 file1
而使用 grep 时,您只保留第一个文件的第一列,以匹配该字段的边界,可能如下所示:
grep -f <(awk '{print "^" $1 "[[:space:]]"}' file2) file1
我们匹配行的开头和后面的空白,或者您可能也想匹配行的结尾。而且你不再寻找固定的模式。如果您修改字段(例如匹配第二个字段)或字段分隔符,则需要更多工作。当你利用分裂的优势时awk
,你就不会考虑这些问题。
答案2
命令
awk 'NR==FNR {a[$1];next}($1 in a){print $0}' someNumbers.txt evenNumbers.txt
输出
2 1
10 1