2014-09-30 62 views
0

好日子,AWK,致命的:試圖訪問現場-1

我想知道如何讓AWK正確打印輸入文件的結構時,我嘗試使用awk 'BEGIN { FS = "," } ; NF > 1 {print $(NF-1)}'

預期輸出

bogota 
bogota 
bogota 
bogota 
bogota 



whitehouse stn 

在所提出的嘗試,我得到:

bogota 
bogota 
bogota 
bogota 
bogota 
whitehouse stn 

而且,如果我不使用NF > 1,我就在這文章標題中提到的錯誤。

預先感謝任何線索

+0

您準確預計什麼輸出?如果該行是空白的,「NF」將是0,而不是1,這就是爲什麼你會得到錯誤。 – rici 2014-09-30 00:43:40

+0

@rici請參閱更新 – 2014-09-30 00:45:40

+0

如果一行僅包含1個字段,您會希望輸出什麼內容? – 2014-09-30 03:31:51

回答

3

如果我正確理解你的需求,你想:

awk -F, '{print $(NF?NF-1:0)}' 

要打印的倒數第二場,如果有兩個或多個字段,否則整個線。

說明:

表達的括號內爲標準?:三元運算符,它具有如下形式condition ? value_if_true : value_if_false。在awk中,數值(如NF)如果不是0,則爲真。

知道在awk中,$是一個採用數字參數的一元運算符。 $(i)ith字段if 0 < i ≤ NF;整行如果i == 0;並且如果i > NF爲空字符串。其他值i是非法的。

+0

是的!非常感謝,這是我想要的。如果我問你'$(NF?NF-1:0)'是如何工作的,那會太多了? – 2014-09-30 00:51:27

+0

@Ajjandro它是一個[三元操作](https://www.gnu.org/software/gawk/manual/html_node/Conditional-Exp.html#Conditional-Exp)。您也可以選擇將其寫爲'awk -F'NF {print $(NF-1)}'文件' – 2014-09-30 03:00:17

+1

@jaypal:我將解釋轉到答案。並且你的程序不是等價的,因爲如果'NF'是0,並且期望的輸出是空行(在這種情況下恰好是'$ 0'的值),它不會輸出任何內容。) – rici 2014-09-30 04:21:19

2
awk -F, '{print $(NF>1?NF-1:"")}' file 
+1

非常感謝你的時間,並且教會了我()。祝你有個美好的一天 – 2014-09-30 13:48:17

+0

美好的一天Ed Morton,很抱歉地問你這樣說,但是,這是:$(NR%2 = 1?sum:「0」 )'correct? – 2014-09-30 22:19:35

+0

@Alejandro取決於你想要它做什麼。也許你應該發佈一個新的問題,它有自己的示例輸入和期望的輸出。 – 2014-09-30 22:25:51