What does a number do after curly braces?

前端 未结 2 485
花落未央
花落未央 2021-02-01 06:05

Why does

echo foo bar..baz bork | awk \'BEGIN{RS=\"..\"} {gsub(OFS,\"\\t\");}1\'

seem to do the same thing as

echo foo bar..baz         


        
2条回答
  •  执笔经年
    2021-02-01 06:46

    I really dislike these types of shortcuts because it obfuscates and misleads how it's being parsed. Like you said,

    awk 'BEGIN{RS=".."} {gsub(OFS,"\t");}1'
    

    seems to be equivalent to

    awk 'BEGIN{RS=".."} {gsub(OFS,"\t");} {print;}'
    

    which would seem to imply that 1 is simply an alias for {print}. But that's not the case at all. 1 is not associated with the previous bracket. It is actually part of a second statement, which has no action, so it uses a default action of {print}. You can think of it like this instead.

    awk 'BEGIN{RS=".."} {gsub(OFS,"\t")}; 1!=0 {print}'
    

    Here's an example that I think demonstrates better the condition {action} format that awk uses:

    echo 'a b c' | awk '1 {print $1}; 2 {print $2}; 0 {print $3}'
    

    a and b are printed because 1 and 2 are nonzero and evaluate to true. c is not printed because 0 evaluates to false.

提交回复
热议问题