亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于每行中的第一個令牌比較2個大文件的最佳方法是什么?

基于每行中的第一個令牌比較2個大文件的最佳方法是什么?

慕斯709654 2022-09-01 17:32:41
我有2個大文件(每個大約500k行或85mb),包含文件的校驗和和文件路徑本身。根據校驗和獲取文件之間差異的最佳方法是什么?我可以編寫Java程序,腳本等,但目標是它必須高效。例如,我有FileA:ec7a063d3990cf7d8481952ffb45f1d8b490b1b5  /home/user/first.txt e0f886f2124804b87a81defdc38ad2b492458f34  /home/user/second.txt文件 B:650bc1eb1b24604819eb342f2ebc1bab464d9210  /home/user/third.txt ec7a063d3990cf7d8481952ffb45f1d8b490b1b5  /home/user/blah/dup.txt我想輸出兩個文件,其中包含文件A和B中的唯一文件。獨一無二e0f886f2124804b87a81defdc38ad2b492458f34  /home/user/second.txt獨特B650bc1eb1b24604819eb342f2ebc1bab464d9210  /home/user/third.txt在這種情況下,“first.txt”和“dup.txt”是相同的,因為它們的校驗和是相同的,所以我將其排除為不唯一。最有效的方法是什么?文件不會以任何方式排序。
查看完整描述

3 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

所以這里有一個快速的答案,但它不是那么有效:


$ join -v1 <(sort FileA) <(sort FileB) | tee UniqueA

e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt


$ join -v2 <(sort FileA) <(sort FileB) | tee UniqueB

650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt

join 命令按鍵匹配兩個已排序文件中的行(默認情況下,鍵是具有默認空間定界符的第一個字段)。但是,上面的命令效率不高,因為我們對文件進行了兩次排序:一次是獲取第一個文件 (-v1) 的唯一值,另一次是獲取第二個文件 (-v2) 的唯一值。我很快就會發布一些改進。


您可以在單個調用中獲取唯一的值,但原始文件會丟失。請參閱下面的代碼:


$ join -v1 -v2 <(sort FileA) <(sort FileB)

650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt

e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt

在這一點上,我們幾乎有了答案。我們擁有兩個文件中所有不匹配的文件。此外,我們只對每個文件進行了一次排序。我相信這是有效的。但是,您丟失了“原點”信息。我們可以使用此迭代或代碼用 sed 標記行:


$ join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ )

650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt B

e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt A

此時,我們有唯一的條目,我們知道它們來自哪個文件。如果您必須在單獨的文件中獲得結果,我想您可以使用awk(或只是更多的bash)來完成此操作。下面是包含 awk 的代碼的又一次迭代:


join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ ) |  awk '{ file="Unique" $3 ; print $1,$2 > file }


查看完整回答
反對 回復 2022-09-01
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

一個只有bash的解決方案:


# create a file with a mark that help to find the source of the hash remove duplicate 

sed 's/^\([0-9a-f]*\)[^0-9a-f]/\1=A=/' FileA | sort | uniq -w 32 > FileA.mark

sed 's/^\([0-9a-f]*\)[^0-9a-f]/\1=B=/' FileB | sort | uniq -w 32 > FileB.mark


# sort the 2 files together , keep only unique hashs 

sort -t= FileA.mark FileB.mark | uniq -w 32 -c  >  HashCountFromAB


# if the count equal 1 ( provide by option -c from uniq )

# we use the mark to find the origin of the hash 


grep '^ *1 [0-9a-f]*=A=' HashCountFromAB > FileA.uniq

grep '^ *1 [0-9a-f]*=B=' HashCountFromAB > FileB.uniq


查看完整回答
反對 回復 2022-09-01
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

對每個文件進行排序,然后將結果與 進行比較。這兩個命令的用法在同名手冊頁中進行了說明。sortcomm



查看完整回答
反對 回復 2022-09-01
  • 3 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號