尾随数字对awk脚本的主体有什么影响?

时间:2012-10-23 20:22:40

标签: unix text awk

我有一个简单的awk one liner,当给定的模式匹配时,将下一行折叠到当前行上。这是:

awk '/two/ { printf $1; next; } 1' test.txt 

使用以下输入:

one
two
three
four
five
six

one
two
three 
four

你得到:

one
twothree
four
five
six

one
twothree 
four

请注意,“三”是折叠的“两个”,这是我想要发生的。我找到了这个解决方案(不记得在哪里),并且认为尾随的“1”似乎是导致所需效果的缺失部分。如果你拿出来,你会得到:

awk '/two/ { printf $1; next; }' test.txt 
twotwo

结果。所以我的问题是,尾随'1'的作用是什么,它在哪里记录?

谢谢!

3 个答案:

答案 0 :(得分:6)

对于awk,1表示为true,当表达式为true时,awk默认打印当前行。

示例:

  • awk '1' /etc/passwd将打印整个文件
  • awk '0' /etc/passwd打印整个文件

如果你擅长算术(或者你有想象力或编程技巧),你可以用这种行为做很多技巧。

答案 1 :(得分:3)

“整个Awk单线末尾的'1'打印出修改过的线条(它只是”打印“的语法糖(本身就是”打印$ 0“的语法糖))”。

- catonmat

答案 2 :(得分:1)

您的答案是您的具体问题但是您发布的脚本不安全。 printf的第一个参数是格式字符串,而不是数据。您有时可以使用它来打印数据,但只有在脚本中硬编码时才会打印,而不是在您从输入中读取数据时。看看如果您的输入恰好包含printf格式化字符串会发生什么:

$ cat file
one
two%s
three
four

$ awk '/two/ { printf $1; next; } 1' file
one
awk: cmd. line:1: (FILENAME=file2 FNR=2) fatal: not enough arguments to satisfy format string
        `two%s'
            ^ ran out for this one

编写脚本的正确方法是:

$ awk '/two/ { printf "%s",$1; next; } 1' file
one
two%sthree
four