'for循环'下的awk'if condition'中的sum变量

时间:2014-02-16 13:53:20

标签: bash awk

我有一个包含3列(n = 3)和FS =“”(file1.txt)的文件:

cat file1.txt
3.1 6.6 0
2.4 7.1 4.9
5.7 1.2 6.1

在这里,我想在每个列的awk中给出'if条件',它将测试条件并返回值1或0(取决于结果)并将其存储在另一个变量,例如:

#!/bin/bash

#code1
awk '{

if  ($1 != 0)

    { x1 = 1 }
    else
    { x1 = 0}


if  ($2 != 0)

    { x2 = 1 }
    else
    { x2 = 0}


if  ($3 != 0)

    { x3 = 1 }
    else
    { x3 = 0}

     x = x1 + x2 + x3
     print x;

     }' file1.txt > output.txt

在这种情况下,所需的输出是:

cat output.txt
2
3
3

我没有遇到任何问题。

考虑这样的情况:不是有3列,而是有10列(n = 10),并且相同的if条件应用于每列。在这种情况下,我想运行一个for循环,在该循环下定义相同的if条件。但我认为我在指定第n个字段时出错。另外如何执行xn变量的总和(x1 + X2 + X3 ... X10)。这是我到目前为止所尝试的:

   awk '{
   for (n=1; n<=10; n++)

    if ($n != 0)

    { xn = 1 }

    else

    { xn = 0 }

    xn+=xn 
    print xn;

             }' file1_10fields.txt > output_10fields.txt

这不是给我正确的输出。我在哪里弄错了?有没有更优雅的方式来做到这一点? xn+=xnprint xn是否应该在循环之外?另外,获得总和的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

你可以使用这个awk:

awk '{sum=0; for (i=1; i<=NF; i++){sum += $i ? 1 : 0} print sum}' file
2
3
3

  • Read more about ternary operator

      

    Awk有条件运算符,即三元运算符(?:),其功能类似于awk If Else语句。如果条件表达式为真,则将执行action1,如果条件表达式为false,则将执行action2。

  •   

答案 1 :(得分:2)

这可能是您期望看到的:

$ awk '
{
    sum = 0
    for (i=1; i<=NF; i++) {
        sum += ($i == 0 : 0 : 1)
        # or `sum += ($i ? 1 : 0)`
        # or `sum += ($i != 0)`
    }
    print sum

}
' file
2
3
3

但您也可以使用GNU awk为\< ... \>字边界执行此操作:

$ gawk '{ print gsub(/\<[^0][^ ]*\>/,1) }' file
2
3
3

如果您喜欢循环,那么您应该接受@ anubhava的答案,但是请在三元表达式周围添加parens,以便它可以在所有awks上运行,并且它使代码更清晰。