2012-10-12 94 views
2

我想執行使用AWK 2個分裂(我有2場分離器),數據的我的工作看起來像類似這樣的字符串:多分裂在AWK

data;digit&int&string&int&digit;data;digit&int&string&int&digit 

正如你所看到的外部字段分隔符是分號,嵌套字符是&符號。 我正在使用awk做的是(假設該字符串將是一個變量名爲test)

echo ${test} | awk '{FS=";"} {print $2}' | awk '{FS="&"} {print $3}' 

這應該抓住「串」字,但由於某種原因,這是行不通的。 它看起來像第二個管道沒有被應用,因爲我只看到第一個awk函數的結果 有什麼建議嗎?

回答

3

試一下:

echo "$test" | awk -F'[;&]' '{print $4}' 

-F'[;&]'

3

使用awk數組

echo $test | awk -F';' '{split($2, arr, "&"); print(arr[3])}' 
3

其他的答案給工作方案指定的多個分離器,但他們並不真正解釋問題。

的問題是,設置FS常規{ ... }塊內的awk腳本不會造成$1$2等重新計算當前行;因此FS將被設置爲後面的任何行,但第一行已經被空白分隔。要在運行腳本之前設置FS,可以使用BEGIN塊(該塊在第一行之前運行);或者,您可以使用-F命令行選項。

製作要麼這些變化將解決您的命令:

echo "$test" | awk 'BEGIN{FS=";"} {print $2}' | awk 'BEGIN{FS="&"} {print $3}' 
echo "$test" | awk -F';' '{print $2}' | awk -F'&' '{print $3}' 

(我也參加了包裹在雙引號$test的自由,因爲不帶引號的參數,擴展是一個麻煩的食譜隨着你的價值。 $test它本來不錯,但我養成了這樣一種習慣,總是用用雙引號,以防萬一。)

+0

這個問題並不需要產生兩次解釋器。 'BEGIN'塊也可以用來代替'-F'。 – jordanm

+1

@jordanm:Re:「這個問題不需要兩次產生翻譯」:是的。我的回答非常明確地指出其他答案(兩次沒有稱爲「awk」)給出了工作方案,我唯一的目標是解釋OP的命令出了什麼問題。因此,我的目標是對OP的命令做出最小*改變,以解決問題,因爲這是解釋問題的最明確的方式。 (你不同意?)Re:「BEGIN」塊也可以用來代替'-F'「:好點。我會編輯我的答案來提及這一點。 – ruakh