2012-10-23 35 views
5

我有一個簡單的awk一行,當給定的模式匹配時,將下一行摺疊到當前行上。那就是:尾隨數字對awk腳本的主體有什麼影響?

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'是做什麼的,它在哪裏記錄?

謝謝!

回答

6

對於awk,1表示爲真,當表達式爲真時,awk默認打印當前行。

例子:

  • awk '1' /etc/passwd將打印整個文件
  • awk '0' /etc/passwd打印整個文件

如果你算術好(或者你有想象力或編程技能),你可以用這個行爲做很多技巧。

3

「整個Awk單行末尾的'1'打印出修改後的行(它僅僅是」print「的語法糖(它本身就是」print $ 0「的句法糖))」「。

- catonmat

+0

啊!感謝您的鏈接。很有幫助。 – drsnyder

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 
相關問題