2017-05-15 90 views
0

我有一堆csv文件的目錄。我想從所有文件中刪除重複的行。遞歸地從文件中刪除重複的行

我試過awk解決方案,但似乎有點單調乏味地爲每個文件做。

awk '!x[$0]++' file.csv

即使我會做 awk '!x[$0]++' *

我會丟失文件名。有沒有辦法使用一個命令或腳本從所有文件中刪除重複項。

只是爲了說明 如果目錄中有3個文件,那麼輸出應包含3個文件,每個文件獨立排序。運行命令或腳本後,相同的文件夾應包含3個文件,每個文件都有唯一的條目。

+0

你要修改的文件到位或創建新的文件? – RomanPerekhrest

回答

0
for f in dir/*; 
do awk '!a[$0]++' "$f" > "$f.uniq"; 
done 

覆蓋現有文件更改爲:awk '!a[$0]++' "$f" > "$f.uniq" && mv "$f.uniq" "$f"經過測試!

0

這將創建一個新的文件,後綴爲.new,只具有獨特的線路:

gawk '!x[$0]++{print>(FILENAME".new")}' *.csv 

它是如何工作

  • !x[$0]++

    這是一個條件。它的計算結果只有當前行,$0,以前沒有見過。

  • print >(FILENAME".new")

    如果條件爲真,那麼這個打印語句執行。它將當前行寫入一個文件,該文件的名稱是當前文件的名稱FILENAME,後跟字符串.new

+0

輸出重定向右側未經表達的表達式是每個POSIX的未定義行爲,所以YMMV取決於您使用的awk版本。改爲使用'print> FILENAME「.new」'。另外,如果你有很多輸入文件,那麼你將不得不關閉輸出文件,否則你會從某些awk中得到「太多打開的文件」的錯誤。或者只是說這是特定於gawk的,不要擔心它:-)。 –

+1

@EdMorton好點。答案已更新。 – John1024

0

隨着GNU AWK輸出文件的「就地」編輯和自動打開/關閉管理:

awk -i inplace '!seen[FILENAME,$0]++' *.csv