私が抱えている問題は、以前の投稿に関連しています。今私が持っているものは次のとおりです。
次のようにランダムに配置されたフィールドを含む 1 つの 900 万行の CSV ファイル。
192.168.12.23,62,LOCAL,341993,23/10/2012 192.168.12.25,11,MONLOCAL$MONREMOTE,33222$56,22/10/2012$18/10/2012 192.168.12.678,14,MONLOCAL,341993,22/10/2012 192.168.12.83,18, , , 192.168.12.21,49,LOCAL$REMOTE,19316$15253,22/10/2012$22/10/2012 192.168.12.79,52,REMOTE,1180306134,19/10/2012 192.168.12.41,44,MONLOCAL$MONREMOTE,1865871$383666,22/10/2012$22/10/2012 192.168.12.29,23,MONREMOTE,151145,18/10/2012
おそらく既にお気づきのように、2 つのフィールド区切り記号があり、次のように
,
なり$
ます。フィールド 1 = IP アドレス
フィールド 2 = 一意の ID
フィールド 3 = IP が使用した接続 (例: LOCAL、REMOTE、MONLOCAL、または MONREMOTE)
フィールド 4 = IP が使用した接続 (LOCAL、REMOTE、MONLOCAL、または MONREMOTE など) またはフィールド 3 に関連する値の場合もあります。
フィールド 5 = フィールド 4 が LOCAL または REMOTE または MONLOCAL または MONREMOTE の場合、フィールド 5 はフィールド 3 の値を表し、それ以外の場合はフィールド 3 に関連するタイムスタンプを表します
フィールド 6 = フィールド 4 が LOCAL または REMOTE または MONLOCAL または MONREMOTE の場合、フィールド 6 はフィールド 4 の値を表し、それ以外の場合は存在しません。
フィールド 7 = フィールド 4 が LOCAL または REMOTE または MONLOCAL または MONREMOTE の場合、フィールド 7 はフィールド 3 のタイムスタンプを表し、それ以外の場合は存在しません。
フィールド 8 = フィールド 4 が LOCAL または REMOTE または MONLOCAL または MONREMOTE の場合、フィールド 7 はフィールド 4 のタイムスタンプを表し、それ以外の場合は存在しません。
上記のファイルを処理し、次の形式を出力する必要があります。フィールドは常に次の順序 (10 フィールド) です。
IP,ID,MONLOCAL_value,MONLOCAL_timestamp,LOCAL_value,LOCAL_timestamp,MONREMOTE_value,MONREMOTE_timestamp,REMOTE_value,REMOTE_timestamp のように:
192.168.12.23,62, , ,341993,23/10/2012, , , , 192.168.12.25,11,33222,22/10/2012, , , , ,56,18/10/2012 192.168.12.678,14,341993,22/10/2012, , , , , , 192.168.12.83,18, , , , , , , , 192.168.12.21,49, , ,19316,22/10/2012, , ,15253,22/10/2012 192.168.12.79,52, , , , , , ,1180306134,19/10/2012 192.168.12.41,44,1865871,22/10/2012, , ,383666,22/10/2012, , 192.168.12.29,23, , , , ,151145,18/10/2012, ,
上記のファイルを処理する次のスクリプトがあります。
nawk 'BEGIN { while (getline < "'"$data"'" > 0) { {FS = "[,,$]"; OFS=","} split($0,flds) {if ($4 ~ /LOCAL|REMOTE|MONLOCAL|MONREMOTE/) { if ($3 ~ /MONLOCAL/) { MONREMOTE_time=flds[8]; MONREMOTE_value=flds[6]; MONLOCAL_time=flds[7]; MONLOCAL_value=flds[5]; } if ($3 ~ /MONREMOTE/) { MONREMOTE_time=flds[7]; MONREMOTE_value=flds[5]; REMOTE_value=flds[6]; REMOTE_time=flds[8]; } if ($3 ~ /REMOTE/) { REMOTE_value=flds[5]; REMOTE_time=flds[7]; LOCAL_value=flds[6]; LOCAL_time=flds[8]; } } else { if($3 ~ /MONLOCAL/) { MONLOCAL_value=flds[4]; MONLOCAL_time=flds[5]; } if ($3 ~ /MONREMOTE/) { MONREMOTE_value=flds[4]; MONREMOTE_time=flds[5]; } if ($3 ~ /LOCAL/) { LOCAL_value=flds[4]; LOCAL_time=flds[5]; } if ($3 ~ /REMOTE/) { REMOTE_value=flds[4]; REMOTE_time=flds[5]; } } } {print MONLOCAL_value",MONLOCAL_time,LOCAL_value,LOCAL_time,MONREMOTE_value,MONREMOTE_time,REMOTE_value,REMOTE_time;} } }'
ここでの悪い点は、以下でわかるように、各行が読み取られた後に配列の値をクリアできないか、行ごとに配列要素を動的に充電する解決策を見つけられないため、出力が期待どおりにならないことです。
4915779000211,62, , ,341993,23/10/2012, , , , , 4915779000212,11,33222,22/10/2012,341993,23/10/2012,56,18/10/2012, , 491639000591,14,341993,22/10/2012,341993,23/10/2012, , , , 491779001768,18,319307448,18/10/2012,19316,22/10/2012,383666,22/10/2012,1180306134,19/10/2012 4915779000213,49,3849259,05/10/2012,19316,22/10/2012,56,18/10/2012,15253,22/10/2012 491779000758,52,9356828,08/10/2012,19316,22/10/2012,56,18/10/2012,1180306134,19/10/2012 4915779000214,44,1865871,22/10/2012,19316,22/10/2012,383666,22/10/2012,1180306134,19/10/2012 491639000221,23,319307448,18/10/2012,19316,22/10/2012,151145,18/10/2012,1180306134,19/10/2012
ですから、この awk 関数を機能させて期待どおりの出力を得る方法をご存知でしたら、よろしくお願いします。