我有一个简单的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'的作用是什么,它在哪里记录?
谢谢!
答案 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