[英]Removing all occurences of duplicates in a file on Unix
我想基於多個列從文件中刪除所有重復出現的事件。 這是一個玩具示例:
想要通過前4列刪除所有不唯一的記錄。 因此,將awk
腳本應用於:
BLUE,CAR,RED,HOUSE,40
BLUE,CAR,BLACK,HOUSE,20
BLUE,CAR,GREEN,HOUSE,10
BLUE,TRUCK,RED,HOUSE,40
BLUE,TRUCK,GREEN,HOUSE,40
BLUE,TRUCK,RED,HOUSE,40
應該導致
BLUE,CAR,RED,HOUSE,40
BLUE,CAR,BLACK,HOUSE,20
BLUE,CAR,GREEN,HOUSE,10
BLUE,TRUCK,GREEN,HOUSE,40
我努力了:
awk -F"," -v OFS="," '{cnt[$1,$2,$3,$4]++} END {for (rec in cnt) if (cnt[rec] == 1) print rec}' ss.txt
這將成功刪除兩個重復項,但不應用正確的分隔符或不打印整個記錄,從而導致:
BLUECARREDHOUSE
BLUETRUCKGREENHOUSE
BLUECARBLACKHOUSE
BLUECARGREENHOUSE
我更喜歡awk
解決方案,但是任何便攜式解決方案都值得歡迎。
假設您希望整個記錄具有前4列中唯一的記錄,則可以完成此工作:
awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $0}
END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
ss.txt
保存行和計數; 取回您輸入的內容。 如果您有千兆字節的文件,這會很痛苦; 有一些方法僅在需要時保存唯一行。 這只會保存每行的第一個版本,並在已知條目不唯一時將其刪除。 (未經測試-但我認為應該可以。根據Ed Morton的 評論進行修改。)
awk -F',' '{ if (cnt[$1,$2,$3,$4]++ == 0)
line[$1,$2,$3,$4] = $0
else
delete line[$1,$2,$3,$4]
}
END {for (rec in line) print line[rec]}' \
ss.txt
如果只需要4個關鍵列,那么這只會將4列保存為您要打印的逗號分隔格式:
awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $1 "," $2 "," $3 "," $4}
END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
ss.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.