在 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[,,,]++} END {for (rec in cnt) if (cnt[rec] == 1) print rec}' ss.txt

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

    BLUECARREDHOUSE
    BLUETRUCKGREENHOUSE
    BLUECARBLACKHOUSE
    BLUECARGREENHOUSE

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

鉴于您想要前 4 列中唯一的记录的整个记录​​,这将完成工作:

awk -F',' '{cnt[,,,]++;line[,,,] = [=10=]}
           END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
    ss.txt

保存行和计数;取回您输入的内容。如果您有千兆字节的文件,这会很痛苦;如果需要,有一些方法可以只保存唯一的行。这只保存每行的第一个版本,并在已知条目不唯一时删除该条目。 (未经测试 - 但我相信它应该有效。根据 from Ed Morton 进行了修改。)

awk -F',' '{ if (cnt[,,,]++ == 0)
                 line[,,,] = [=11=]
             else
                 delete line[,,,]
           }
           END {for (rec in line) print line[rec]}' \
    ss.txt

如果您只需要 4 个键列,那么这只是将 4 个列保存为您将打印的逗号分隔格式:

awk -F',' '{cnt[,,,]++;line[,,,] =  ","  ","  "," }
           END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
    ss.txt