【问题标题】:Awk with a variable带变量的 awk
【发布时间】:2014-02-06 04:13:55
【问题描述】:

我有一个 awk 命令可以打印出第 26 列中出现“200”的总次数。

awk '$26 ~ /200/{n++}; END {print n+0}' testfile

如何修改此语句以便可以将 200 作为变量传递?例如如果我有一个值为 200 的变量 $code

提前致谢

【问题讨论】:

  • 如果code 的值为20 并且数字200 出现在字段26 中,是否应该匹配?您是在寻找第 26 场的全部比赛还是部分比赛?

标签: awk


【解决方案1】:
awk '$26 ~ code {n++} END {print n+0}' code=200 testfile

如果命令行上的文件名具有 var=val 形式,则将其视为变量 任务。变量 var 将被赋值为 val。

§ Awk Program Execution

【讨论】:

  • 这是我不知道的,但在The AWK Programming Language 中查找后想注意:文件名 var=val 赋值为 performed at the time when that argument would otherwise be accessed as a file. This type of assignment allows variables to be changed before and after a file is read. 意味着顺序很重要。
  • @n0741337 正确和以这种方式分配的变量在 BEGIN 部​​分中不可用,这可能会导致混淆/错误。只有在需要更改文件之间的变量值时才应使用此方法,否则 awk -v awkvar="$shellvar" 几乎总是正确的方法。有关更多详细信息,请参阅我为 comp.unix.shell 常见问题撰写的文章cfajohnson.com/shell/cus-faq-2.html#Q24
【解决方案2】:
awk  -v var="$shellVar" '$26~var{n++} END{print n}' file

你在上面看到了如何在 awk 中使用 shell 变量。为您的 awk 单行代码提供一些注意事项:

  • print n+0 没有必要。因为你定义的n,不是从输入文本中挑选出来的,而且你明确做了n++,所以它是数字类型,n+0没有意义

  • END 之前的; 应该被删除

  • 我复制了您关于检查 200 部分的代码。但这是有风险的。如果 26 美元只有一个数字,你可以考虑使用 1*$26 == 200$26 == "200" 在这种情况下使用正则表达式可能会给出错误的结果,想想你的 26 美元,价值是:20200

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2016-01-01
    • 1970-01-01
    • 2020-05-19
    • 2020-03-03
    • 2016-01-02
    • 2020-11-14
    • 2019-03-18
    • 2019-01-17
    相关资源
    最近更新 更多