Linux
來自包含多列的文件的 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
如果是製表符分隔的文件,我該怎麼辦?謝謝
對於您的邏輯由列定義的情況,有時使用它更簡單
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
分裂時,您不會考慮這些問題。