簡體   English   中英

如何比較兩個大文件並獲得結果到第三個文件?

[英]How to compare two big files and get results to third file?

我有兩個檔案

第一個文件是這樣的:

www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com

第二個文件是這樣的(;;;之后的數字在0-10之間):

www.example.com;;;2
www.domain.com;;;5
www.other-domain;;;0
www.exa-ample.com;;;4

我想比較這兩個文件並輸出到第三個文件,如下所示:

www.otherexample.com
www.other-example.com

兩個文件都很大(超過500mb)

使用comm(1)比較兩個排序的文件並給出差異。 使用grep(1)sort(1)將文件轉換為適合與comm比較的輸入格式。 bash使用流程替換將其綁定在一起:

comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)

comm-23參數表示忽略文件( -3 )和文件2( -2 )特有的行。 根據您的確切規格,您可以使用-1-2-3

grep -o '^[^;]*' file2.txt只會去除第一個分號之后的所有內容。 您可以為此使用sed(1) ,但是如果您僅提取一行的一部分而不添加任何其他內容,則grep通常會更快。

comm需要對輸入文件進行排序,因此使用sort來完成。 輸出將被排序。 sort使用特定於語言環境的排序規則,因此您可能需要根據所需的確切排序規則來設置LC_ALL = C。

請注意,在您的問題中,文件2中具有www.other-domain,但文件1中具有www.other-domain.com。考慮到輸出,我認為這是文件2中的錯字。

這將並行運行所有進程並通過它們流傳輸文件數據,因此,即使文件很大,也不會占用大量內存或任何額外的磁盤空間來存儲臨時文件。

如果file2中的輸入包含file1內容的子集,則可以

sed 's/;.*//' file2 | fgrep -vxf - file1 >not-in-file2

相同的一般思想可以應用於diffcomm 但是, comm需要排序的輸入,但是如果這不是問題(或者您的數據可以排序開始),則只需預處理file2的數據即可。

sed 's/;.*//' file2.sorted | comm -12 - file1.sorted >cmp.out

輸入需要排序的約束條件是允許comm處理非常大的文件,因為它只需要隨時將最新數據保留在內存中。 您可以使用自己的自定義awk腳本執行相同的操作。

您可以使用:

$ diff file1 file2 > file3

但這對我來說似乎是您想忽略的;;0部分,對吧? 然后,您需要逐行剝離最后一部分,最后與diff

您可以使用diff命令並將輸出定向到第3個文件。 例如,

% diff data1.txt data2.txt > diffs

diff手冊頁顯示了許多選項,這些選項使您可以控制比較(處理和輸出)。

假設您擁有在帖子中顯示的數據data1.txtdata2.txt的數據,則無需指定選項的基本交互操作將產生:

% diff data1.txt data2.txt 

1,6d0
< www.example.com
< www.domain.com
< www.otherexample.com
< www.other-domain.com
< www.other-example.com
< www.exa-ample.com

如果a是具有第一內容的文件,而b是具有第二內容的文件:

while read line; do grep -q $line b || echo $line; done < a

它打印第二個文件中找不到的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM