2012-02-15 4 views
2

私はで区切られた各ライン上のファイルにキーと値のペアのセットを持っている「:」それぞれの行を読んだ後、以下に述べるようAwkのフィールドセパレータ

私はawkを使用して、キーと値のペアを取得しています

key=$(echo $LINE | awk -F " *: *" '{print $1}') 
value=$(echo $LINE | awk -F " *: *" '{print $2}') 

値そのものに ":"が含まれている場合、それがさらに分割され、 ":"の前に値を読み取るだけになります。あなたのファイルが区切り記号として解釈されている文字が含まれている場合

は、どのように私は、全体の値

+0

までは、あなたの投稿へのサンプル入力と期待される出力を追加することを検討してください。推測作業を大幅に減らすのに役立ちます。がんばろう。 – shellter

答えて

3

あなただけの最初:に分割したい場合は、bash文字列操作を使用する方が簡単になります。

key=${LINE%%:*} 
value=${LINE#*:} 

%%はの背面からその正規表現にマッチする最長の文字列(:*)をオフのLOP文字列の先頭に一致する最短文字列を削除します。#は、文字列の先頭に一致する最短文字列を削除します。例:

$ LINE="a:b:c" 
$ key=${LINE%%:*} 
$ value=${LINE#*:} 
$ echo $key 
a 
$ echo $value 
b:c 

OK、あなたのシェルはこれを持っていないので、あなたがsedを使用することができます。

key=$(echo "$LINE" | sed 's/:.*$//') 
value=$(echo "$LINE" | sed 's/[^:]*://') 

最初に発見し、コロンとラインの端部との間のすべてを削除し、 (ほとんどの場合、sedのを含む)regexesはデフォルトでは貪欲で、最初のコロンからすべてのものになります。 2番目の行は、最初のコロンまでのすべてを削除します。

+0

これは私のシェルではサポートされていません。 – Poorna

+1

@siri ok、 'sed'でそれを行う方法を忠告しました。 – Kevin

0

を読むことができます、あなたは何か他のもので、それらの文字を置き換えるか、または別の区切り文字を選択する必要があります。

1

あなたは常にフィールドに区切り文字が含まれていると問題に遭遇します。上記の例では

echo $LINE | sed 's/:/|/3' | awk ... 

、あなたがいることを知っていた場合には第三の発生:あなたは特定のフィールドは常に区切り文字が含まれていることがわかっている場合、あなたはsed最初にその発生を置き換えるの回避策を考え出すことができます:の行はで、いつもとフィールド内にある場合は、|などと置き換えることができます。しかし、それは解決策の一つのハックです。可能な場合は区切り文字を変更するか、エスケープのようなものを考慮に入れるために解析するコードを記述してください(例:\:)。古い質問に答えるが、カットは、これは非常に単純になるだろう使用して

+1

またはawkにすべて保存し、問題のあるフィールドを一時変数にして、 'split(tmpVar、tmpArr、": "); myVal = tmpArr [1]; myVal2 = tmpArr [2]; ... '。皆さんお元気で。 – shellter

1

key=$(echo $LINE | cut -d: -f1) 
value=$(echo $LINE | cut -d: -f2-) 

フィールド2を意味-f2-エンド