2012-12-14 84 views
0

以下命令不會從奇數行選擇第2個字符串,從奇數偶數行選擇第4個字符串。 show_statistic.sh | grep -A 1 vlan | awk '{ if ((NR % 2) == 1) { print $2 } else { print $4 } }'
它打印每行的第二個和第四個字符串。我做錯了什麼?用AWK連接每兩條線

+2

什麼是奇數偶數行?你能看到一些樣本輸入和預期輸出嗎? –

+1

顯示show_statistics.sh的輸出,並在處理show_statistics.sh輸出結束時告訴我們您要做什麼以及一些預期的輸出。你不需要grep和awk,你正在使用awk,所以我們需要從第1步開始。 –

+0

@ sampson-chen英語不是我的母語。 odd-even可以是2nd,4th,6th .. {n = 1 odd-even = 2 * n,even = 2 * n-1}行作爲我們的字典:-) – tsoomo

回答

2

它看起來像你的預期結果是從包含「vlan」和以下的行。

您的代碼將有獨特的處置工作,但比一個你的型動物結果將被分離的雙線路只containig多個響應「 - 」作爲記錄在grep的:

-A NUM 
     Places a line containing a group separator (--) between 
     contiguous groups of matches. With the -o or --only-matching 
     option, this has no effect and a warning is given. 

所以這條線你就越想在1號線,4,7 ... 和在線2,5,8,第四,第二個參數...

所以,你的代碼可以是:

show_statistic.sh | grep -A 1 vlan | awk '{ if ((NR % 3) == 1) { print $2 } else { if (NR % 3 == 2) { print $4 } } }' 

我寫了一個小的文本文件來測試:

1line here 
2foo 
vlan 2a 3a 4a 5a 
1 2 3 4 5 
bar 

line here 
vlan 2a 3a 4a 5a 
1 2 3 4 5 
line here 
baz 

結果是:

$ grep -A 1 vlan file| awk '{ if ((NR % 3) == 1) { print $2 } else { if (NR % 3 == 2) { print $4 } } }' 
2a 
4 
2a 
4 
+0

+1用於計算shell的佈局命令輸出。 –

+0

謝謝Pierre-Louis Laffont。組分隔符( - )是第三行:-)我知道它 – tsoomo

2

如果在你的shell命令的輸出如下示例文件的通過@皮埃爾 - LouisLaffont那麼這裏創建的佈局你應該使用完整的命令:

$ awk 'f{print $4;f=0} /vlan/{print $2;f=1}' file 
2a 
4 
2a 
4 

當如果認定VLAN它打印的第2場,並設置一個標誌說VLAN被發現。在下一行它將打印第4個字段並重置標誌。不能簡單得多。

+0

它工作得更快。謝謝@Ed Morton – tsoomo