2016-07-07 13 views
0

私は次の形式のデータを持つテキストファイルを持っています。私は最初の列の各値に対して1つの行を作りたいと思います。列の値を行に変換する

0-09935152       RC=3  CC=2 L=10-11 
        M=1 
        BNT=4 
0-09935153     F=31      L=11 
        M=1 
0-09935154     F=31      L=11 
        M=1 
0-09935155     F=31      L=11 
        M=1 
0-09935156     F=31      L=11 
        M=1 
0-09935157     F=31      L=11 
        M=1 
0-09935158     F=31      L=11 
        M=1 
0-09935159     F=31      L=11 
        M=1 
0-0993516     F=31      L=11 
        M=1 
0-0993517     F=31      L=11 
        M=1 
0-0993518     F=31      L=11 
        M=1 
0-0993519     F=0    CC=2 
        M=1 

対応するすべての値を1つの行に取り込みたいとします。期待される出力は次のようになります

Code|M|F|CC|L|BNT|RC 
0-09935152|1||2|10-11|4|3 
0-09935153|1|31||11||| 

私はawkを使ってテキストファイルを解析しようとしています。私は列を分離することしかできませんが、これ以上進めることはできません。

何か助けていただければ幸いです。

+0

すべての関連データが同じ行に出回っていますか?その例はちょっと面倒です。 –

+0

いいえ、それは挑戦です。たとえば、最初の行0-09935152を持つすべてのコードでは、対応する値は、次の列のそれぞれの下にあります。私はそれぞれに1つの行を作ろうとしています。 – ThePatBan

+0

すべてのコードは "0-"で始まりますか? – Chet

答えて

1

のawk -f script.awkファイル

script.awk

BEGIN{RS="[ \n]";OFS="|";print "Code","M","F","CC","L","BNT","RC"} #print headers 
length > 1 {size=split($0,t,"=")} #split values by "=" 
size==2{a[t[1]]=t[2]} #non-code values 
size==1 && flag {print code,a["M"],a["F"],a["CC"],a["L"],a["BNT"],a["RC"];delete a;code=$0} #print values for each code switch 
size==1 && !flag{flag++;code=$0} #skip first 
{delete t;size=0} #clear data 
END{print code,a["M"],a["F"],a["CC"],a["L"],a["BNT"],a["RC"]} # print last value 

出力

Code|M|F|CC|L|BNT|RC 
0-09935152|1||2|10-11|4|3 
0-09935153|1|31||11|| 
0-09935154|1|31||11|| 
0-09935155|1|31||11|| 
0-09935156|1|31||11|| 
0-09935157|1|31||11|| 
0-09935158|1|31||11|| 
0-09935159|1|31||11|| 
0-0993516|1|31||11|| 
0-0993517|1|31||11|| 
0-0993518|1|31||11|| 
0-0993519|1|0|2||| 
+0

素晴らしい、私の問題を完全に解決します。ありがとうございました – ThePatBan

0
BEGIN { 
    RS="(+|\n)" # set the record separator to put every piece of data on a separate row for split 
    OFS="|"  # # below: initialize the header 
    arr[0]="Code"; arr["M"]="M"; arr["F"]="F"; arr["CC"]="CC"; arr["L"]="L"; arr["BNT"]="BNT"; arr["RC"]="RC" 
} 
/^[0-9]+-/ {  # print arr when new code starts 
    print arr[0],arr["M"],arr["F"],arr["CC"],arr["L"],arr["BNT"],arr["RC"]; 
    delete arr; # empty previous values from arr 
    arr[0]=$0 
} 
{ 
    split($0,brr,"[=]"); # split from "=" to another array 
    arr[brr[1]]=brr[2] # first part is the index, latter is the value 
} 
END { # print the last line, too bad you can't "/^[0-9]+-/ || END {..." 
print arr[0],arr["M"],arr["F"],arr["CC"],arr["L"],arr["BNT"],arr["RC"]; 
} 

$ awk -f test.awk test.in 
Code|M|F|CC|L|BNT|RC 
0-09935152|1||2|10-11|4|3 
0-09935153|1|31||11|| 
0-09935154|1|31||11|| 
[...] 
+0

OPのCommnetsをチェックしてください。コードはゼロ以外の値 – Chet

+0

Dudeから始めることができます。それは夏休みの最初の日の最初の草案でした。私の朝のコーヒーのために私に分を与えてください。 :D –

+1

は "|"にOFSを使用できますデリミタ – Chet

関連する問題