2012-03-11 43 views
0

我以這種形式讀取一行數據的字段:獲取個人K,V從bash腳本單行

KEYNAME:value,KEYNAME:value,KEYNAME:value 

(請注意,關鍵是沒有空格的字符串和值是整數)

我需要選擇一些特定的按鍵(不知道它們的相對位置),並在不同的行打印他們的價值觀:

value 
value 
value 

到目前爲止,我來到像轉換輸入行的多個關鍵:v ALUE線,grepping我要鑰匙,氣勢已知順序,最後傳遞,通過再次切斷,除去關鍵部分:

sed 's/,/\n/g' | egrep '(FooKey|BarKey|BazKey)' | sort | cut -d':' -f2 

我以爲我可以安排使用awk的東西,而我只知道的基本知識,但我只能通過他們的位置順序來管理字段,而不能通過他們的名字(關鍵名稱)進行管理。

可以用其他語言(即Python或Perl的),但我把它作爲一個練習做下面的shell工具的一切來完成。此外,我仍然更喜歡上述解決方案來加載像python或perl這樣的更大的解釋器。

回答

1

這將只打印值:如果你想在一個特定的順序值

awk 'BEGIN { RS=","; FS=":" } { print $2 }' 

,你可以把它們放在一個數組:

awk ' 
    BEGIN { RS=","; FS=":" } 
    { values[$1] = $2 } 
    END { 
     print values["FooKey"]; 
     print values["BarKey"]; 
    }' 
+0

我*知道*說awk或某事能夠管理這個。感謝您的解決方案:) – Luke404 2012-03-13 14:41:26

1
awk 'BEGIN { FS=":"; RS = ","; } /FooKey|BarKey|BazKey/ { print $1 }' 
+0

您可能想要:'awk -F:-v RS =,'$ 1 ==「FooKey」|| $ 1 ==「BarKey」|| $ 1 ==「BazKey」{print $ 2} – 2012-03-11 20:00:13

+0

是的,這是一個2美元,使它打印值而不是鍵,但是這個解決方案不能維持給定的輸出順序(甚至改變/ FooKey | BarKey | BazKey /輸出順序的順序仍然遵循字段的排序方式輸入)。 – Luke404 2012-03-13 14:41:02