Linux

來自包含多列的文件的 grep

  • October 6, 2020

我有一個名為 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

如果是製表符分隔的文件,我該怎麼辦?謝謝

對於您的邏輯由列定義的情況,有時使用它更簡單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分裂時,您不會考慮這些問題。

引用自:https://unix.stackexchange.com/questions/613170