逐行匹配兩個文件?

逐行匹配兩個文件?

我有兩個由數字組成的文件。現在,我想將第一個文件的行與第二個文件的所有行匹配,並在找到匹配時增加計數器。如何為此編寫 bash 腳本?

file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3

答案1

假設file1.txtfile2.txt有一組這樣的數字:

file1.txt:

1
2
4
6
7

file2.txt:

2
6
7
8
9

您可以嘗試幾種方法,具體取決於您想要如何處理資料或您想要在過程中收集什麼。

  • Grep 可以在檔案中搜尋模式字串。可以使用該標誌使用另一個檔案來提供模式-f。該-x標誌還確保您只找到整行匹配,以便模式“2”與“24”不匹配。最後,-c標誌會計算出匹配的數量。把它們放在一起你會得到:

    grep -x -c -f file1.txt file2.txt
    
  • 如果您想對一路上的數字執行其他操作以獲取總數,您可以採取更手動的方法:

    counter=0
    while read number; do
        grep -q -x "$number" file2.txt && let counter=$counter+1
    done < file1.txt
    echo $counter
    

    當您為 file1.txt 中的每一行再次讀取 file2.txt 時,效率要低得多,但如果您還想對數字執行其他操作或沿途操作文件,則更容易修補到像這樣的循環那。不使用該-q標誌,因此 grep 是靜默的,僅返回退出代碼。使用該程式碼,我們可以判斷是否找到匹配項,並且僅在找到匹配項時才增加計數器。

無論您採用哪種方式,請確保考慮到某些行與作為其他數字的子字串的數字部分相符的可能性。此外,您還需要考慮如果每行有多個匹配項,您希望發生什麼。每次重複都會增加計數器還是只發生一次。請注意,上面的兩個選項對此的處理方式不同!對於某些資料集,他們會給出不同的結果。如果您希望他們給出相同的結果,則可以採用兩種技術。例如,第一個可以檢查刪除了所有重複項的檔案版本,因此沒有任何內容會符合多次:

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)

相關內容