在 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
我想根据列数从文件中删除两次重复项。这是一个玩具示例:
想删除前 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
保存行和计数;取回您输入的内容。如果您有千兆字节的文件,这会很痛苦;如果需要,有一些方法可以只保存唯一的行。这只保存每行的第一个版本,并在已知条目不唯一时删除该条目。 (未经测试 - 但我相信它应该有效。根据
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