2012-03-11 3 views
0

bashスクリプト内の1行のフィールド: 個々のkを取得し、V私はこの形式でのデータの行を読ま

KEYNAME:value,KEYNAME:value,KEYNAME:value 

は(キーは、スペースのない文字列があり、値は整数ますので予めご了承ください)

私は(彼らの相対的な位置を知らなくても)、いくつかの特定のキーを選択して、別の行にその値を印刷する必要があります。

value 
value 
value 

これまでのところ、私は複数のKEYに入力行を変換するようなものに来ます。v私が欲しいのキーをgrepをALUEライン、既知の順序を課し、最終的にを通じて重要な部分を削除するには、再度カットすることを渡す:

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

私は、私はちょうど基本を知っているのはawkで何かを、アレンジと考えていましたフィールドの管理は、名前(キー名)ではなく、位置の順序でのみ行うことができます。

他の言語(PythonやPerlなど)で行うこともできますが、通常のシェルツールを使用してすべてを行う練習として取り上げます。また、私はまだ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

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

あなたはおそらく:awk -F:-v RS =、 '$ 1 == "FooKey" || $ 1 == "BarKey" || $ 1 == "BazKey" {print $ 2} –

+0

はい、これはキーの代わりに値を出力するために$ 2ですが、この解決策では、出力上で(FooKey | BarKey | BazKeyの順序を変更しても)出力順序を維持できません。入力)。 – Luke404

関連する問題