我有一个相对复杂的 Bash 问题。我有一个两列 CSV 文件,其中第一列中包含重复值,以及这些重复值中的重复值(第二列中)。对于第一列中的每个重复项,我只需要保留第二列中具有最频繁值的行。
例如,如果第一列中有以下 5 行带有
1234
的内容:
1234,000
1234,000
1234,000
1234,111
1234,111
...只应保留包含
1234,000
的一行,并删除其他 4 行。当然,对于除 1234
之外的所有重复项,需要在整个文件中重复此操作。
我可以使用这些解决方案之一来查找最常出现的行,但这里困难的部分是弄清楚如何为每组重复项执行此操作。
使用 awk:
BEGIN {
FS = OFS = ","
}
{
col1s[$1]
if (++ndup[$0] == 1)
uniq[$1, ++nuniq[$1]] = $0
}
END {
for (col1 in col1s) {
max = 0
rec = ""
for (i = 1; i <= nuniq[col1]; i++) {
cand = uniq[col1, i]
if (ndup[cand] > max) {
max = ndup[cand]
rec = cand
}
}
print rec
}
}
出现平局时选择哪条记录取决于 awk 的实现。