2016-03-25 17 views
0

は、いくつかのAWK-FUが必要現在の列の値に基づいて列を作成します! は13列を持っている必要がありのAwk:

ybcxl,05,06,07,08,09,10,11 
yxxu,01 
yxxu,03,05,06,07,08,09,10,11 
ybban,01,03,04,05,06,07,08 
zxvhu,01,02,03,04,05,06,07,08,09,10,11,12 

各行:私は、次のようなデータ構造を持っています。 Col 2から始めて、私はその値を評価する必要があります。値は常に列数でなければなりませんマイナスそれぞれの行が正しい順序既存の値を持つ列の適切な数を持っているように、言い換えれば1、2列目は、私は(コンマを挿入して)列を作成する必要が1の値を持つ必要があります(1番目のレコードのオフセットで1からマイナス1)。訂正されたデータの

例:確か列番号は、対応するよりも1つ多くされていることを確認するために

$ awk -f af.awk af.txt | awk -F, '{ print NF }' 
13 
13 
13 
13 
13 

テスト:

yxxu,01,,,,,,,,,, 
yxxu,,,03,,05,06,07,08,09,10,11, 

答えて

0
$ cat af.txt 
ybcxl,05,06,07,08,09,10,11 
yxxu,01 
yxxu,03,05,06,07,08,09,10,11 
ybban,01,03,04,05,06,07,08 
zxvhu,01,02,03,04,05,06,07,08,09,10,11,12 

$ cat af.awk 
BEGIN { FS="," } 
{ 
    printf "%s", $1 
    for (i=2; i<=NF; ++i) a[$i+0] = $i 
    for (i=1; i<=12; ++i) printf ",%s", (i in a ? a[i] : "") 
    print "" 
    delete a 
} 

$ awk -f af.awk af.txt 
ybcxl,,,,,05,06,07,08,09,10,11, 
yxxu,01,,,,,,,,,,, 
yxxu,,,03,,05,06,07,08,09,10,11, 
ybban,01,,03,04,05,06,07,08,,,, 
zxvhu,01,02,03,04,05,06,07,08,09,10,11,12 

テストは、すべての行が13列を持っていることを確認しますフィールド値(存在):

$ awk -f af.awk af.txt | awk -F, '{ error = 0; for(i=2;i<=13;++i) { if ($i && i != ($i + 1)) error = 1 } print (error ? "ERROR!" : "GOOD!")}' 
GOOD! 
GOOD! 
GOOD! 
GOOD! 
GOOD! 

説明:

回避するprintfを使用して(カンマに

のprintf "%sの" $ 1
出力の最初のフィールドを{FS = ""}

セットフィールドセパレータをBEGIN改行)(I = 2

。私< = NF; ++インデックスとして、その数値 等価物を使用してI)[$ I + 0] = $ I
ストアレコード中に存在する全ての数字配列に、($i+0番号に文字列を変換)

用(i = 1; I < = 12; ++ I)のprintf "%sの"、(I [I]で ""?)
番号がである場合、我々は、出力する各フィールドについて配列は、単にカンマを印刷し、それ以外の場合は、 それを印刷し

印刷 ""
印刷次の入力レコード

+0

を読む前に
クリアにアレイを削除する出力レコード

を終了する改行は、スニペットと説明の両方をありがとう! – user3425900