簡體   English   中英

為什么我的awk命令會打印一個額外的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM