[英]shell script to compare two files and write the difference to third file
[英]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
相同的一般思想可以應用於diff
或comm
。 但是, 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.txt
和data2.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.