【问题标题】:awk $4 column if column = value with characters thereafterawk $4 column if column = value with 其后的字符
【发布时间】:2021-03-01 11:25:02
【问题描述】:

我有一个包含以下数据的文件,例如:

20        V     70000003d120f88  1                            2
20        V     70000003d120f88  2                            2
20x00     V     70000003d120f88  2                            2
10020     V     70000003d120f88  1                            5

我想得到第 4 列数据的总和。

使用下面的命令,我可以实现这一点,但是 20x00 行被排除在外。我希望以 20 开头的所有内容都必须相加,并且在此之前没有任何内容,例如 20*:

cat testdata.out | awk '{if ($1 == '20') print $4;}' | awk '{s+=$1}END{printf("%.0f\n", s)}'

输出值必须是:

5

如何使用 awk 实现这一点。我尝试的以下方法也不起作用:

cat testdata.out | awk '$1 ~ /'20'/ {print $4;}' | awk '{s+=$1}END{printf("%.0f\n", s)}' 

【问题讨论】:

    标签: unix awk ksh


    【解决方案1】:

    不需要使用3个进程,任何事情都可以由一个AWK进程完成。看看吧:

    awk '$1 ~ /^20/ { a+=$4 } END { print a }'  testdata.out
    

    解释:

    $1 ~ /^20/   checks to see if $1 starts with 20
    if yes, we add $4 in the variable a
    finally, we print the variable a
    

    结果 5

    编辑:

    Ed Morton 正确地指出,结果应该始终是同一类型,这可以通过在结果中加 0 来解决。 如果需要区分结果 0 是否是由于不匹配,可以设置退出状态 (输出状态0)或只匹配零值(输出状态1)。 可以检查不同输入数据的退出代码,例如回声$? 代码如下所示:

    awk '$1 ~ /^20/ { a+=$4 } END { print a+0; exit(a!="") }'  testdata.out
    

    【讨论】:

    • print a+0 所以如果/当没有行匹配/^20/ 时,你会得到0 而不是空行输出。
    • @Ed-Morton 通常是的。但是我们失去了命中是 $4=0 还是没有命中的区别。取决于需要什么。
    • 产生数字输出的命令应该总是产生数字输出。有关此类脚本的标准/预期行为的参考,请尝试 seq 3 | grep -c 2seq 3 | grep -c 5 并注意无论是否找到匹配项,输出始终为数字。如果您想要找到一些东西(成功)与什么都没有(失败)退出状态(如 grep 也提供),您可以通过在打印后添加 ; exit (a!="") 来设置适当的退出状态。
    【解决方案2】:

    想通了:

    cat testdata.out | awk '$1 ~ /'^20'/ {print $4;}' | awk '{s+=$1}END{printf("%.0f\n", s)}' 
    

    以上可能不适用于所有情况,但以下就足够了:

    i=20
    cat testdata.out | awk '{if ($1 == "'"$i"'" || $1 == ""'"${i}"'"x00") print $4;}' | awk '{s+=$1}END{printf("%.0f\n", s)}'
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2022-11-30
    • 2020-07-01
    • 2022-12-31
    相关资源
    最近更新 更多