awk:如果不是零,则替换第二列

时间:2012-11-29 05:07:38

标签: regex unix if-statement awk

我正在尝试使用awk检查三列数据集的第二列,如果它不为零则替换它的值。我找到this regex来查找非零数字,但我无法弄清楚如何将gsubprint结合起来替换内容并将其输出到新文件。我只想在第二列上运行gsub,而不是第一列或第三列。有一个简单的awk单行代码吗?还是我在做一些更复杂的事情?我甚至试过做一个表达式来检查零,但我不确定如何在awk中执行if / else语句。

我半成功的命令是:

awk '$2 != 0 {print $1, 1, $3}' input > output

问题是如果第二列为零,则不会打印出该行。这是我认为gsub或if / else语句可行的地方,但我无法弄清楚awk语法。对此有任何指导意见。

2 个答案:

答案 0 :(得分:7)

请记住,在awk中,任何非0的都是真的(尽管任何不是“0”的字符串也是如此)。所以:

awk '$2 { $2 = 1; print }' input > output

$2如果不是0,则评估为true。其余的很明显。这会复制您的脚本。

如果你想打印所有的行,包括$ 2的零行,我会用这个:

awk '$2 { $2 = 1 } 1' input > output

这与上面的替换相同,但最后的1是“true”的简写。如果没有语句,则运行{print}的默认语句。

这是你要找的吗?

在行动中,它看起来像这样:

[ghoti@pc ~]$ printf 'none 0 nada\none 1 uno\ntwo 2 tvo\n'
none 0 nada
one 1 uno
two 2 tvo
[ghoti@pc ~]$ printf 'none 0 nada\none 1 uno\ntwo 2 tvo\n' | awk '$2 { $2 = 1 } 1'      
none 0 nada
one 1 uno
two 1 tvo
[ghoti@pc ~]$ 

答案 1 :(得分:2)

这是你想要的吗?

awk '$2 != 0 {print $1, 1, $3} $2 == 0 {print}' input > output

或使用sed:

sed 's/\([^ ]*\) [0-9]*[1-9][0-9]* /\1 1 /' input > output