AWK匹配正数和负数

时间:2009-03-23 02:01:49

标签: regex unix awk

我的数据如下:

-1033  
-  
222
100
-30
-
10

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

为什么我的awk失败了?

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

3 个答案:

答案 0 :(得分: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就是更好的工具。

答案 1 :(得分:1)

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

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

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

如果数据实际上是如图所示(仅限一列),那么您应该使用$1而不是$4 - 我不会使用$0,因为那是整条线,它看来前两行末尾有空格会导致$0 "-1033 ""- "

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

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

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

答案 2 :(得分:1)

为什么要查看$4?您似乎应该按照litb说的那样检查$1$0

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

grep -v '^-$'

删除仅包含短划线或

的线条
grep -v '^ *- *$'

删除仅包含短划线和可能包含空格字符的行。