2

良い英語で表現する方法がわからないので、私のタイトルは少し混乱しています。

これが私の問題です。私はこのようにフォーマットされたフラットファイルを持っています:

: name1 field1-1: field2:value1-2 field3:"value1-3"     field4:{"Value-1-4"}
: name2 field2-1: field2:"value2-2"      field4:{"Value-2-4"} field3:Value2-3
: name3 field3-1:  field3:{"Value-3-3"}  field2:value3-2   field4:value3-4

したがって、フィールドが同じ順序で表示されないため、適切なファイルではないことがわかります。値の型が異なる場合があり、欠落している場合もあります。元のファイルも 5 ~ 20 フィールドの長さです。

ここで私が最終的に持っていたいものは次のとおりです。

: name1 field2:value1-2 field4:{"Value-1-4"}      
: name2 field2:"value2-2" field4:{"Value-2-4"}
: name3 field2:value3-2 field4:value3-4

したがって、最終ファイルに必要なフィールドと、それらを表示する正確な順序を知っています。

私は何かを試しました

sed "s/(field1:.*)|(field2:.*)/\2\1/g"

正しいシンタックスではないことはわかっていますが、読みやすくするためです。ただし、最初の一致のみが一致し、他のグループは一致しないため、機能しません。

私がやりたいことはたくさんの で可能だと思いますが、どうすればそれができるのawkか本当にわかりません。bash私は, sed, awkandを使用することを本当に好みますgrepが、選択の余地がない場合は、少し対処できますPerl

編集:簡単な例を挙げるかもしれませんが、実際のファイルには実際に異なるフィールド名があります

おやすみなさい、そしてありがとう

4

3 に答える 3

3

片道awk:

Script.awk:

{
    split ($0,ary,/ /); 
    printf "%s %s ", ary[1],ary[2]; 
    for (i=3;i<=length(ary);i++) {
        if (ary[i] ~ /^field[2,4]:/) { 
            printf "%s ",ary[i]
        }
    }
    print "" 
}

出力:

[jaypal:~/Temp] cat file
: name1 field1-1: field2:value1-2 field3:"value1-3"     field4:{"Value-1-4"}
: name2 field2-1: field2:"value2-2"      field4:{"Value-2-4"} field3:Value2-3
: name3 field3-1:  field3:{"Value-3-3"}  field2:value3-2   field4:value3-4

[jaypal:~/Temp] awk -f script.awk file
: name1 field2:value1-2 field4:{"Value-1-4"}
: name2 field2:"value2-2" field4:{"Value-2-4"}
: name3 field2:value3-2 field4:value3-4
于 2013-06-09T21:59:40.987 に答える
1

いくつかのシード:

sed -e 's/^\(: [^ ]*\)\(.*\)\(field4:[^ ]*\)/\1 \3REMOVE \2/' \
    -e 's/^\(: [^ ]*\)\(.*\)\(field2:[^ ]*\)/\1 \3 \2/'       \
    -e 's/REMOVE.*//' input 

入力行が次の場合:

: name1 field1-1: field2:value1-2 field3:"value1-3"     field4:{"Value-1-4"}

最初の式は、field4 を名前の後の最初の列に移動し、REMOVE を追加します。

: name1 field4:{"Value-1-4"}REMOVE  field1-1: field2:value1-2 field3:"value1-3

2 番目の式は、field2 を最初の列に移動します。

: name1 field2:value1-2 field4:{"Value-1-4"}REMOVE  field1-1:  field3:"value1-3"

3 つ目は、REMOVE から最後まで削除します。

: name1 field2:value1-2  field4:{"Value-1-4"}
于 2013-06-09T21:48:10.427 に答える