2012-04-19 88 views
2

我有一些腳本使用awk解析CSV文件。我注意到,如果一個單元格是空的,awk只是移動到下一個單元格。這意味着,如果我問它來讀取列4,但該單元格是空的,它由5列,例如打印數據:使用awk解析CSV文件時,爲什麼會忽略空單元格?

echo "[email protected]@[email protected]@5" | awk -F "@*" '{print $4}' 

我預期的結果是,它會打印什麼,因爲第4欄是空的。

  • 爲什麼awk跳過第4列?
  • 我怎樣才能讓awk不忽略空列?

回答

8

問題不在於你的想法。 awk不會忽略空單元格;它解析該行的4場,而不是5

[[email protected]]$ echo "[email protected]@[email protected]@5" | awk -F "@*" '{print NF}' 
4 

這是監守你使用@*作爲字段分隔符,它允許一個或多個連續@作爲字段分隔符(@@@@@@,.. 。都是有效的字段分隔符)。

嘗試使用-F "@"來代替。

[[email protected]]$ echo "[email protected]@[email protected]@5" | awk -F "@" '{print NF}' 
5 
[[email protected]]$ echo "[email protected]@[email protected]@5" | awk -F "@" '{print $4}' 

[[email protected]]$ echo "[email protected]@[email protected]@5" | awk -F "@" '{print $5}' 
5 
+2

'awk'實際上是善良在這裏,而忽略了正則表達式的空匹配。由於正則表達式可以爲空(匹配空字符串),嚴格來說,輸入行「1234 @@ 5」應該實際分割爲字段1,2,3,4,5。或者甚至可以在開始處有一個額外的空字段並結束。畢竟,正則表達式匹配字符串中的每個位置。 – Kaz 2012-04-19 19:47:59

+0

@Kaz好點。編輯答案,所以它更少誤導。 – 2012-04-20 11:01:34