2017-02-20 74 views
1

這兩個文件都有至少2000行的字符串和數字數據行。 如何將非重複數據從file2.txt添加到file1.txt。 基本上file2有新的數據行,但我們也想確保我們不會向file1.txt添加重複的行。比較unix中的兩個文件並將增量添加到一個文件

  • File1.txt>這是主數據文件
  • File2.txt>這個文件有我們想要添加到file1

感謝新數據,

+0

這些行的順序是否顯着?他們排序了嗎? – Barmar

+0

順序並不重要。 – Vcode

回答

4

排序兩個文件與一起-u選項可以刪除重複項。

sort -u File1.txt File2.txt > NewFile.txt && mv NewFile.txt File1.txt 
+0

在50,000行數據文件上嘗試過這種方法,並且在內存使用方面似乎非常高效。我得到輸出文件很快。我認爲這是我在這裏的解決方案。 – Vcode

+0

@Barmer什麼排序-u實際上基於排序記錄?請注意最欄目看起來相似,但有些不同。單詞之間有不同的間距也會使行被認爲是獨特的? – Vcode

+0

它對排序鍵上的記錄進行排序。默認情況下,它是整條線,空格是重要的。可以選擇將密鑰更改爲特定字段,並忽略空格和/或大小寫。閱讀手冊頁。 – Barmar

1

您可以使用grep,像這樣:

# grep those lines from file2 which are not in file1 
grep -vFf file1 file2 > new_file2 
# append the results to file1 
cat new_file2 >> file1 
+0

嗯。從內存使用的角度來看,這味道可能很昂貴。 (如果它需要更多的內存,'sort'可能會破壞它的工作,以便將部分保留在磁盤上,但是我不確定如果grep會試圖保留模式列表或構造一個模式列表正則表達式來自特別大的來源列表)。 –

+0

另一方面,這保留了線的現有順序,並且不花費時間排序。根據使用情況,這可能是最好的解決方案,或唯一正確的解決方案,這三個答案。 – hek2mgl

+0

公平的論據。如果我是OP,並且這種方法是我的文件隨着時間的推移將被修改的唯一方式,那麼我可能會花費一次*對文件進行排序*,然後使用'comm'方法......但你說得對,這裏有一切用例。 –

2

如果文件進行排序,只是有一些選擇的另一種選擇(我喜歡comm :))

comm --check-order --output-delimiter='' -13 File1.txt File2.txt >> File1.txt 
+0

@CharlesDuffy:是的,這個假設確實排序。 – Wrikken

+0

*點頭*。絕對是最有效的方法,如果你的文件都是預先排序的。 (好吧 - 我想也可以使用Barmar的方法和GNU合併排序標誌,但我希望這兩種方法在性能上大體相當)。 –

+0

@Wrikken這種情況下的文件沒有排序。想知道腳本中的「-13」是什麼? – Vcode

1

使用awk:

awk '!a[$0]++' File1.txt File2.txt 
+0

這對已經存在的方法有什麼優勢?它的內存效率低下 - 甚至超過grep -vf方法,因爲這種方法甚至可以在內存中存儲第二個文件中存儲的行,而只存儲來自已存在文件的行 - 我不確定它增加了什麼好處。 –