保留列的每组重复项中最常见的行

问题描述 投票:0回答:1

我有一个相对复杂的 Bash 问题。我有一个两列 CSV 文件,其中第一列中包含重复值,以及这些重复值中的重复值(第二列中)。对于第一列中的每个重复项,我只需要保留第二列中具有最频繁值的行。

例如,如果第一列中有以下 5 行带有

1234
的内容:

1234,000
1234,000
1234,000
1234,111
1234,111

...只应保留包含

1234,000
的一行,并删除其他 4 行。当然,对于除
1234
之外的所有重复项,需要在整个文件中重复此操作。

我可以使用这些解决方案之一来查找最常出现的行,但这里困难的部分是弄清楚如何为每组重复项执行此操作。

bash csv scripting line text-processing
1个回答
0
投票

使用 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 的实现。

© www.soinside.com 2019 - 2024. All rights reserved.