使用awk,如何为读取值分配'null'?
我确定这是一个固定的角色,我找不到它。
例如,
我有一串像这样的awk:
awk '
$3==24{print "stuff"}
$3==23{print "stuff"}
'
我需要知道如何使用相同的格式来计算空白列,以便如果$ 3 =空白{print“stuff”}
谢谢!
答案 0 :(得分:9)
尝试这样做:
awk '
$3==24{print "stuff"}
$3==23{print "stuff"}
!$3{print "null"}
' file.txt
如果您需要处理$3
,如果它为零(false
为awk
),请尝试执行以下操作:
!$3 && $3 != 0{print "null"}
答案 1 :(得分:8)
在默认的awk处理中,没有“空白”列。
字段由空格分隔,即由一个或更多空白字符(基本上为制表符和空格)分隔。所以给出了这个输入:
this that the_other
foo bar
第一行$1
,$2
和$3
的分别为this
,that
和the_other
,但对于第二行bar
为$2
,无论第一个和第二个字段之间有多少空白。
如果指定其他字段分隔符,则可以为空字段:
$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | awk -F: '{print $3}'
the_other
bar
或者,如果您希望在脚本本身中设置字段分隔符:
$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | \
awk 'BEGIN { FS = ":" } {print $3}'
the_other
bar
但您可以使用正则表达式作为字段分隔符:
$ ( echo 'this that the_other' ; echo 'foo bar' ) | \
awk 'BEGIN { FS = "[ ]" } {print $3}'
the_other
bar
(某些非常旧的Awk实现可能不支持此处的正则表达式。)
正则表达式"[ ]"
没有获得与空格字符相同的特殊处理。
参考GNU Awk手册:
字段通常由空格序列(空格,TAB, 和换行符),而不是单个空格。连续两个空格没有 划定一个空字段。字段分隔符
FS
的默认值为 包含单个空格" "
的字符串。如果awk解释了这个值 以通常的方式,每个空格字符将分隔字段,因此两个 连续的空格会在它们之间形成一个空字段。原因 这不会发生是FS
的值为单个空格 特殊情况 - 用于指定分隔的默认方式 字段。如果
FS
是任何其他单个字符,例如","
,则每次出现 该字符分隔两个字段。连续两次出现 划定一个空字段。如果角色出现在开头或 该行的结尾,也是一个空字段。空间 字符是唯一不遵循这些字符的单个字符 规则。
和Using Regular Expressions to Separate Fields。
但要小心这个;要么您必须修改文件以使用不同的分隔符,要么您的解析对字段之间的空白数量敏感(foo bar
(一个空白)将与foo bar
不同(与两个空白))。
根据您的应用程序,您可能会考虑按列号而不是awk识别的字段解析行。