【问题标题】:Generic awk script to calculate average on any field through command line argument通过命令行参数计算任何字段平均值的通用 awk 脚本
【发布时间】:2010-11-28 20:58:09
【问题描述】:

我想编写一个通用的 awk 脚本,它可以将文件和字段编号(在该文件中)作为输入,并给出该文件中该字段的平均值。我会像这样使用它:

bash$ avg.awk 3 input.file
22
bash$ avg.awk 4 input.file
2001

当然,如果我事先知道要平均哪个字段(例如,3 美元),我可以编写脚本。应该是这样的:

//{tot+=$3; count++}
END{
    print tot/count;
}

但我希望能够通过命令行选项更改我想要平均的字段。那可能吗?谢谢!

【问题讨论】:

    标签: command-line scripting awk average


    【解决方案1】:

    这个会做你想做的:

    $ cat avg.awk
    #!/usr/bin/env awk -f
    # Calculate average, syntax: avg.awk field-number file
    BEGIN { field = ARGV[1]; ARGV[1] = "" }
    { sum += $field }
    END { print sum / NR }
    
    $ cat data
    1 5 7
    3 6 5
    8 4 6
    
    $ avg.awk 1 data
    4
    
    $ avg.awk 2 data
    5
    
    $ avg.awk 3 data
    6
    

    【讨论】:

    • 我不能像你描述的那样使用 env 。现在,我只是把真正的路径放到 awk 上。它虽然有效。谢谢!
    • 使用 /usr/bin/env 是我应对不同系统在不同位置安装 awk 的方式。您可能想从命令提示符发出“which env”以找出 env 在您的系统中的位置。
    • /usr/bin/env: awk -f: No such file or directory 这是我收到的消息。 env 在 /usr/bin/env 中。虽然你已经解决了我最初的问题,但很想了解如何使用 env。
    • 你是对的:它不起作用。我从我的 Tcl 脚本中复制该行:#!/usr/bin/env tclsh 该行适用于 tclsh,但不适用于 awk,我很困惑。
    【解决方案2】:
    { tot += $field; count++ }
    END { print tot/count }
    

    调用喜欢 awk -v field=3 -f avg.awk input.file

    【讨论】:

    • 您可以使用 NR 来避免计数变量:{tot+=$f} END { print tot/NR}
    • ... 假设 OP 实际上并不想过滤掉标题或跳过记录。 :)
    • 谢谢,它确实有效!另一个答案使命令行更易于使用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2014-07-31
    • 2020-03-17
    • 2023-03-03
    相关资源
    最近更新 更多