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

ope*_*pes 3 regex unix awk if-statement

我试图用来awk检查三列数据集的第二列,如果它不为零,则替换它的值.我发现这个正则表达式查找非零数字,但我无法弄清楚如何结合gsub使用print,以取代内容,并输出到一个新的文件.我只想gsub在第二列上运行,而不是第一列或第三列.awk这样做有一个简单的单行程吗?还是我在做一些更复杂的事情?我甚至试过做一个表达来检查零,但我不知道怎么做if/else语句awk.

我半成功的命令是:

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

问题是如果第二列为零,它不会打印出行.这是我认为的任何一个gsub或if/else语句可以工作,但我无法弄清楚awk语法.任何有关这方面的指导将不胜感激.

gho*_*oti 7

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

awk '$2 { $2 = 1; print }' input > output
Run Code Online (Sandbox Code Playgroud)

$2,如果它不计算为true 0.其余的很明显.这会复制您的脚本.

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

awk '$2 { $2 = 1 } 1' input > output
Run Code Online (Sandbox Code Playgroud)

这与上面的替换相同,但1最后是"真实"的简写.如果没有语句,{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 ~]$ 
Run Code Online (Sandbox Code Playgroud)