【问题标题】:Calculating a sum, grouped by columns, from a CSV file in awk从 awk 中的 CSV 文件计算按列分组的总和
【发布时间】:2017-08-04 15:38:04
【问题描述】:

我是 Bash 新手。我有一个包含四列的 CSV 文件,值用逗号分隔:

jack,england,498,a
roy,wales,344,b
ben,ireland,679,a
ron,scotland,895,a
emma,england,344,a
jason,scotland,566,a
ketty,wales,433,b

我的输出应该是这样的:

england,842
ireland,679
scotland,1461
wales,777

城市名称必须按字母顺序排序,输出只能在终端上打印。

这是我的代码:

#! /bin/awk -f
awk '{a[$1" "$2]+=$3}END{for (i in a){print i,a[i]}}' file.csv | sort -k2

当我使用awk -f file.awk 运行此代码时,它会给我一个语法错误。我已经阅读了很多关于这个问题的答案,但没有一个对我有帮助。

invalid char in expression  '''

awk 之后的语法错误。

【问题讨论】:

  • 顺便说一句,当您只想按$2 求和时,为什么要将$1" "$2 作为索引?
  • 抱歉,我只是想运行我的代码,看看输出是什么。我知道如何处理。

标签: bash shell awk


【解决方案1】:

您的脚本是调用 awk 的 shell 脚本,而不是 awk 脚本。所以这是完全正确的,除了#!/bin/awk -f

使用#!/bin/sh shebang,将其修复为纯 awk 代码。


后者可能看起来像:

#!/usr/bin/env gawk -f

BEGIN {
  # gawk extension: iterate over for loop in sort order (so we don't need to pipe to sort)
  PROCINFO["sorted_in"]="@ind_str_asc"

  # split on commas
  FS=OFS=","
}

{
  a[$2]+=$3
}

END {
  for (i in a) {
    print i, a[i]
  }
}

【讨论】:

  • 先生,我必须制作一个 awk 脚本,运行命令应该是 awk -f file.awk file.csv
  • 如果您将awk -f 替换为脚本,则它不是 awk 脚本。这是 shell 语法,而不是 awk 语法。
  • 你绝对可以用awk -f file.awk file.csv 运行它,如果你的awk 是GNU awk; gawk 只是确保我们不运行任何其他版本。
  • 只是好奇如果我必须以从 Z 到 A 的逆字母顺序打印城市名称会怎样
  • 那就是@ind_str_desc。见gnu.org/software/gawk/manual/html_node/…
【解决方案2】:

短 GNU datamash 解决方案:

datamash -st, -g 2 sum 3 < file.csv

输出:

england,842
ireland,679
scotland,1461
wales,777

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2013-03-04
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多