我有一个包含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+=xn
和print xn
是否应该在循环之外?另外,获得总和的正确方法是什么?
答案 0 :(得分:3)
你可以使用这个awk:
awk '{sum=0; for (i=1; i<=NF; i++){sum += $i ? 1 : 0} print sum}' file
2
3
3
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上运行,并且它使代码更清晰。