我正在尝试使用awk
检查三列数据集的第二列,如果它不为零则替换它的值。我找到this regex来查找非零数字,但我无法弄清楚如何将gsub
与print
结合起来替换内容并将其输出到新文件。我只想在第二列上运行gsub
,而不是第一列或第三列。有一个简单的awk
单行代码吗?还是我在做一些更复杂的事情?我甚至试过做一个表达式来检查零,但我不确定如何在awk
中执行if / else语句。
我半成功的命令是:
awk '$2 != 0 {print $1, 1, $3}' input > output
问题是如果第二列为零,则不会打印出该行。这是我认为gsub
或if / else语句可行的地方,但我无法弄清楚awk
语法。对此有任何指导意见。
答案 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