删除Unix上文件中出现的所有重复项

时间:2015-01-14 19:25:49

标签: unix awk duplicate-removal

我想基于多个列从文件中删除两次重复项。这是一个玩具示例:

想删除前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

成功删除了两个dupes,但没有应用正确的分隔符或打印整个记录,导致:

    BLUECARREDHOUSE
    BLUETRUCKGREENHOUSE
    BLUECARBLACKHOUSE
    BLUECARGREENHOUSE

我更喜欢awk解决方案,但欢迎任何便携式解决方案。

1 个答案:

答案 0 :(得分:3)

鉴于你想要前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

保存线条和计数;找回你输入的内容。如果你有千兆字节的文件,这会很痛苦;如果你愿意,有办法只保存唯一的行。这仅保存每行的第一个版本,并在已知非唯一时删除条目。 (未经测试 - 但我认为它应该有效。根据commentEd 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