我想基于多个列从文件中删除两次重复项。这是一个玩具示例:
想删除前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
解决方案,但欢迎任何便携式解决方案。
答案 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
保存线条和计数;找回你输入的内容。如果你有千兆字节的文件,这会很痛苦;如果你愿意,有办法只保存唯一的行。这仅保存每行的第一个版本,并在已知非唯一时删除条目。 (未经测试 - 但我认为它应该有效。根据comment的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