【问题标题】:awk process own field valueawk 处理自己的字段值
【发布时间】:2014-03-25 20:15:39
【问题描述】:

我有一个格式如下的 CSV 文件:

Postcode,Count,Total
L1 3RT,20,345.65

我正在使用 awk 按邮政编码对计数和总数求和,但是我想对邮政编码的第一部分执行此操作(即 L1,从而组合 L1 3RT 和 L2 4XW 的值)。示例数据和现有 awk 命令如下所示。

CM1 4QR,979,32950.8
CM1 4QS,2,145.14
CM13 1DL,115,3771

AWK线

awk 'BEGIN { FS = "," } ; {sums[$1] += $2; totals[$1] += $3} END { for (i in sums) printf("%s,%s,%i\n", i, sums[i],totals[i])}' coach.csv

我希望输出是

CM1,981,33095.94
CM13,115,3771

【问题讨论】:

  • 您可以使用空格作为分隔符再次通过 awk 管道 $1。然后您将获得邮政编码的第一部分,然后将其用作数组的索引。

标签: csv awk


【解决方案1】:

以下作品:

awk -F'[ ,]' '
{
  sums[$1] += $3; 
  totals[$1] += $4;
} 
END { 
  for (i in sums) 
    printf("%s,%i,%i\n", i, sums[i],totals[i]);
}' coach.csv

它使用两个分隔符,逗号和空格。它适用于您的示例输入,但不适用于其他地方有空格的更复杂的输入。

【讨论】:

    【解决方案2】:

    您可以在 awk 中使用多个分隔符。请试试这个

    awk -F'[, ]' '{sums[$1] += $3; totals[$1] += $4} END {for (i in sums) printf("%s,%.2f,%.2f\n", i, sums[i], totals[i])}' coach.csv
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2021-02-06
      • 2010-10-09
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2011-01-07
      相关资源
      最近更新 更多