簡體   English   中英

在Unix上刪除文件中所有重復項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM