我有一堆csv文件的目錄。我想從所有文件中刪除重複的行。遞歸地從文件中刪除重複的行
我試過awk解決方案,但似乎有點單調乏味地爲每個文件做。
awk '!x[$0]++' file.csv
即使我會做 awk '!x[$0]++' *
我會丟失文件名。有沒有辦法使用一個命令或腳本從所有文件中刪除重複項。
只是爲了說明 如果目錄中有3個文件,那麼輸出應包含3個文件,每個文件獨立排序。運行命令或腳本後,相同的文件夾應包含3個文件,每個文件都有唯一的條目。
我有一堆csv文件的目錄。我想從所有文件中刪除重複的行。遞歸地從文件中刪除重複的行
我試過awk解決方案,但似乎有點單調乏味地爲每個文件做。
awk '!x[$0]++' file.csv
即使我會做 awk '!x[$0]++' *
我會丟失文件名。有沒有辦法使用一個命令或腳本從所有文件中刪除重複項。
只是爲了說明 如果目錄中有3個文件,那麼輸出應包含3個文件,每個文件獨立排序。運行命令或腳本後,相同的文件夾應包含3個文件,每個文件都有唯一的條目。
for f in dir/*;
do awk '!a[$0]++' "$f" > "$f.uniq";
done
覆蓋現有文件更改爲:awk '!a[$0]++' "$f" > "$f.uniq" && mv "$f.uniq" "$f"
經過測試!
這將創建一個新的文件,後綴爲.new
,只具有獨特的線路:
gawk '!x[$0]++{print>(FILENAME".new")}' *.csv
它是如何工作
!x[$0]++
這是一個條件。它的計算結果只有當前行,$0
,以前沒有見過。
print >(FILENAME".new")
如果條件爲真,那麼這個打印語句執行。它將當前行寫入一個文件,該文件的名稱是當前文件的名稱FILENAME
,後跟字符串.new
。
輸出重定向右側未經表達的表達式是每個POSIX的未定義行爲,所以YMMV取決於您使用的awk版本。改爲使用'print> FILENAME「.new」'。另外,如果你有很多輸入文件,那麼你將不得不關閉輸出文件,否則你會從某些awk中得到「太多打開的文件」的錯誤。或者只是說這是特定於gawk的,不要擔心它:-)。 –
@EdMorton好點。答案已更新。 – John1024
隨着GNU AWK輸出文件的「就地」編輯和自動打開/關閉管理:
awk -i inplace '!seen[FILENAME,$0]++' *.csv
你要修改的文件到位或創建新的文件? – RomanPerekhrest