我有一个看起来像这样的数据:
-1033
-
222
100
-30
-
10
我想要做的是捕获除“仅破折号”条目之外的所有数字。
为什么我下面的 awk 失败了?
awk '$4 != "-" {print $4}'
你的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
那么它是更好的工具。
假设您的数据文件实际上是多列的,并且值在第 4 列中,则以下将起作用:
awk '$4 != "-" {print $4} {}'
它仅在不是“-”的地方打印值。您的版本可能会打印该值(或两次),因为默认操作是打印。添加{}
使默认操作“什么都不做”。
如果数据实际上如图所示(仅一列),您应该使用$1
而不是$4
- 我不会使用$0
,因为那是整行,而且您的前两行末尾有空格,这将$0
导致."-1033 "
"- "
但是,如果它是单列,我根本不会使用 awk 而是:
grep -v '^-$'
grep -v '^ *- *$'
"-"
第二个允许字符两侧的空格。
你为什么要检查$4
?看来您应该检查$1
或$0
如 litb 所说。
但是 awk 是完成这项工作的重量级工具。尝试
grep -v '^-$'
删除仅包含破折号或
grep -v '^ *- *$'
删除仅包含破折号和可能包含一些空格字符的行。