我的数据如下:
-1033
-
222
100
-30
-
10
我想要做的是捕获除“仅限破折号”条目之外的所有数字。
为什么我的awk失败了?
awk '$4 != "-" {print $4}'
答案 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 '^ *- *$'
删除仅包含短划线和可能包含空格字符的行。