[英]Why does my awk command print an extra line?
我發現很難調試我的shell腳本。 我有以下文件test.csv
The Gardens,Gard (AUS),AEST,NSW,,Sandown Park,SPrk (AUS),AEST,VIC,,Grade 5,GR5,
Wentworth Park,WPrk (AUS) ,AEST,NSW,,The Meadows,Mead (AUS),AEST,VIC,,Juvenille,JUV,
Angle Park,AnPk (AUS),ACST,SA,,Warragul,Wgul (AUS),AEST,VIC,,,,
WPrk(AUS)有一個額外的尾隨空白區域,我希望修剪然后打印。 運行
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv
產生
Gard (AUS):
Wentworth Park WPrk (AUS) AEST NSW The Meadows Mead (AUS) AEST VIC Juvenille JUV
WPrk (AUS):
AnPk (AUS):
這是我想要的,除了第二行,我無法弄清楚為什么會出現
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv
由於您在任何操作塊( {...}
)之外都有gsub
,因此將每行作為條件進行評估。 它返回它所做的替換次數,因此它將在大多數輸入上返回0,但在要更改的行上返回1。 由於沒有伴隨它的動作,執行默認動作,打印線; 這就是你打印全行的原因。
正如其他人所說的那樣,修復程序將gsub
調用放在action塊中。
(另外,為什么\\,
,?逗號不是shell中的特殊字符。)
如何將命令更改為:
awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}' test.csv
那是'{'向前移動。
編輯正如其他人所說,你不需要逃脫逗號, -F,
就足夠了。 感謝其他回答者:)。
你寫了:
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv
這已破了。
awk腳本的格式是一堆看起來像這樣的結構:
{ }
這里的想法是輸入數據中的每一行都是根據條件進行評估的。 如果匹配,則執行相應大括號中的命令。 所以你可能想要的更像是這樣:
awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":";}' test.csv
請注意,您不需要轉義字段分隔符,除非您的shell會嚴重對待它(即如果它是垂直條, |
,而不是逗號)。 通過排除腳本中的條件,可以在每條線上執行花括號命令。 因此,無論是否需要修剪,都會削減$ 2,然后根據您的示例在您的問題中打印結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.