0

我有一个看起来像这样的数据:

-1033  
-  
222
100
-30
-
10

我想要做的是捕获除“仅破折号”条目之外的所有数字。

为什么我下面的 awk 失败了?

 awk '$4 != "-" {print $4}'
4

3 回答 3

1

你的awk脚本说

如果第四个字段不是破折号,打印出来

但是,如果该行不是破折号,您希望将其打印出来

awk '$0 != "-"'

默认操作是打印,因此不需要正文。

如果你想打印一组数字,如果你使用 gawk,你可以使用 GNU awk 扩展。它允许使用正则表达式拆分记录:

gawk 'BEGIN { RS="(^|\n)-($|\n)" } { print "Numbers:\n" $0 }'

现在,而不是行,它需要一组数字,由仅包含 的行分隔-。将字段分隔符 ( FS) 设置为换行符允许您遍历此类组中的数字:

gawk 'BEGIN { FS="\n"; RS="(^|\n)-($|\n)" } 
      { print "Numbers:"; for(i=1;i<=NF;i++) print " *: " $i }'

但是我同意其他答案。如果您只想过滤掉与某些文本匹配的行,grep那么它是更好的工具。

于 2009-03-23T02:16:18.020 回答
1

假设您的数据文件实际上是多列的,并且值在第 4 列中,则以下将起作用:

awk '$4 != "-" {print $4} {}'

它仅在不是“-”的地方打印值。您的版本可能会打印该值(或两次),因为默认操作是打印。添加{}使默认操作“什么都不做”。

如果数据实际上如图所示(仅一列),您应该使用$1而不是$4- 我不会使用$0,因为那是整行,而且您的前两行末尾有空格,这将$0导致."-1033 ""- "

但是,如果它是单列,我根本不会使用 awk 而是:

grep -v '^-$'
grep -v '^ *- *$'

"-"第二个允许字符两侧的空格。

于 2009-03-23T02:48:57.287 回答
1

你为什么要检查$4?看来您应该检查$1$0如 litb 所说。

但是 awk 是完成这项工作的重量级工具。尝试

grep -v '^-$'

删除仅包含破折号或

grep -v '^ *- *$'

删除仅包含破折号和可能包含一些空格字符的行。

于 2009-03-23T02:52:30.227 回答