4

我正在尝试使用awk检查三列数据集的第二列,如果它不为零则替换它的值。我找到了这个正则表达式来查找非零数字,但我不知道如何结合gsub替换print内容并将其输出到新文件。我只想gsub在第二列上运行,而不是第一列或第三列。是否有一个简单awk的单线来做到这一点?还是我正在考虑做一些更复杂的事情?我什至尝试过做一个表达式来检查零,但我不确定如何在awk.

我半成功的命令是:

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

问题是如果第二列为零,它不会打印出该行。这是我认为gsubif/else 语句可以工作的地方,但我无法弄清楚awk语法。对此的任何指导将不胜感激。

4

2 回答 2

8

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

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

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

如果要打印所有行,包括 $2 中的零,我会这样做:

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

这与上面的替换相同,但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 ~]$ 
于 2012-11-29T05:19:09.120 回答
3

这是你想要的吗?

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
于 2012-11-29T05:11:50.940 回答