awk - 如果column = null

Num*_*pty 6 bash awk

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

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

例如,

我有一串像这样的awk:

awk '
$3==24{print "stuff"}
$3==23{print "stuff"}
'
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Gil*_*not 9

试着这样做:

awk '
    $3==24{print "stuff"}
    $3==23{print "stuff"}
    !$3{print "null"}
' file.txt
Run Code Online (Sandbox Code Playgroud)

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

!$3 && $3 != 0{print "null"}
Run Code Online (Sandbox Code Playgroud)

  • 如果`$ 3`中的值为0会发生什么? (2认同)
  • 我认为`$ 3 ==""`比`!$ 3 && $ 3!= 0`更清晰.在这种情况下,听起来OP实际上想要测试`NF <3`. (2认同)

Kei*_*son 8

在默认的awk处理中,没有"空白"列这样的东西.

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

this that the_other
foo       bar
Run Code Online (Sandbox Code Playgroud)

对于第一行$1,$2以及$3this,that,和the_other,分别,但对于第二行bar$2不管有多少坯料有所述第一和第二场之间.

如果指定其他字段分隔符,则可以为空字段:

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | awk -F: '{print $3}'
the_other
bar
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢在脚本本身中设置字段分隔符:

$ ( echo 'this:that:the_other' ; echo 'foo::bar' ) | \
    awk 'BEGIN { FS = ":" } {print $3}'
the_other
bar
Run Code Online (Sandbox Code Playgroud)

但您可以使用正则表达式作为字段分隔符:

$ ( echo 'this that the_other' ; echo 'foo  bar' ) | \
  awk 'BEGIN { FS = "[ ]" } {print $3}'
the_other
bar
Run Code Online (Sandbox Code Playgroud)

(一些非常古老的Awk实现可能不支持它的正则表达式.)

正则表达式"[ ]"没有得到空格字符所做的特殊处理.

参考GNU Awk手册:

默认字段拆分:

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

如果FS是任何其他单个字符,例如",",则该字符的每次出现都会分隔两个字段.连续两次出现划界空字段.如果字符出现在行的开头或结尾,那么它也会分隔一个空字段.空格字符是唯一不遵循这些规则的单个字符.

使用正则表达式分隔字段.

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

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

  • wrt`"至少在GNU Awk中,你可以使用正则表达式作为字段分隔符"` - 所有awks都是如此.GNU awk在这方面只是特殊的,它也允许RS成为正则表达式. (2认同)