grep 来自包含多列的文件

grep 来自包含多列的文件

我有一个名为 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

相关内容