awk - 如果column = null

时间:2013-03-27 17:38:06

标签: bash awk

使用awk,如何为读取值分配'null'?

我确定这是一个固定的角​​色,我找不到它。

例如,

我有一串像这样的awk:

awk '
$3==24{print "stuff"}
$3==23{print "stuff"}
'

我需要知道如何使用相同的格式来计算空白列,以便如果$ 3 =空白{print“stuff”}

谢谢!

2 个答案:

答案 0 :(得分:9)

尝试这样做:

awk '
    $3==24{print "stuff"}
    $3==23{print "stuff"}
    !$3{print "null"}
' file.txt

如果您需要处理$3,如果它为零(falseawk),请尝试执行以下操作:

!$3 && $3 != 0{print "null"}

答案 1 :(得分:8)

在默认的awk处理中,没有“空白”列。

字段由空格分隔,即由一个或更多空白字符(基本上为制表符和空格)分隔。所以给出了这个输入:

this that the_other
foo       bar
第一行$1$2$3

分别为thisthatthe_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手册:

Default field splitting

  

字段通常由空格序列(空格,TAB,   和换行符),而不是单个空格。连续两个空格没有   划定一个空字段。字段分隔符FS的默认值为   包含单个空格" "的字符串。如果awk解释了这个值   以通常的方式,每个空格字符将分隔字段,因此两个   连续的空格会在它们之间形成一个空字段。原因   这不会发生是FS的值为单个空格   特殊情况 - 用于指定分隔的默认方式   字段。

     

如果FS是任何其他单个字符,例如",",则每次出现   该字符分隔两个字段。连续两次出现   划定一个空字段。如果角色出现在开头或   该行的结尾,也是一个空字段。空间   字符是唯一不遵循这些字符的单个字符   规则。

Using Regular Expressions to Separate Fields

但要小心这个;要么您必须修改文件以使用不同的分隔符,要么您的解析对字段之间的空白数量敏感(foo bar(一个空白)将与foo bar不同(与两个空白))。

根据您的应用程序,您可能会考虑按列号而不是awk识别的字段解析行。