9

使用 awk,您将如何分配“null”值来读取?

我确定这有一个固定的字符,我只是找不到它。

例如,

我有一串这样的awk:

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

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

谢谢!

4

2 回答 2

11

尝试这样做:

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

如果您需要处理$3它是否为零(falsefor awk),请尝试这样做:

!$3 && $3 != 0{print "null"}
于 2013-03-27T17:40:02.787 回答
8

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

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

this that the_other
foo       bar

对于第一行$1, $2, 和$3, , 和this,和, 但对于第二行是, 不管第一和第二字段之间有多少空白。thatthe_otherbar$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 手册的参考:

默认字段拆分

字段通常由空格序列(空格、制表符和换行符)分隔,而不是由单个空格分隔。一行中的两个空格不分隔空字段。字段分隔符的默认值FS是一个包含单个空格的字符串," ". 如果 awk 以通常的方式解释这个值,每个空格字符将分隔字段,因此一行中的两个空格将在它们之间形成一个空字段。不会发生这种情况的原因是单个空格作为 的值FS是一种特殊情况——它被用来指定分隔字段的默认方式。

如果FS是任何其他单个字符,例如",",则该字符的每次出现都会分隔两个字段。两个连续的事件界定了一个空字段。如果字符出现在行首或行尾,则也将界定一个空字段。空格字符是唯一不遵循这些规则的单个字符。

使用正则表达式分隔字段

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

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

于 2013-03-27T17:45:06.447 回答