2

私が抱えている問題は、以前の投稿に関連しています。今私が持っているものは次のとおりです。

  1. 次のようにランダムに配置されたフィールドを含む 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 のタイムスタンプを表し、それ以外の場合は存在しません。

  2. 上記のファイルを処理し、次の形式を出力する必要があります。フィールドは常に次の順序 (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, , 
    
  3. 上記のファイルを処理する次のスクリプトがあります。

    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;}
     }
    }'
    
  4. ここでの悪い点は、以下でわかるように、各行が読み取られた後に配列の値をクリアできないか、行ごとに配列要素を動的に充電する解決策を見つけられないため、出力が期待どおりにならないことです。

    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 関数を機能させて期待どおりの出力を得る方法をご存知でしたら、よろしくお願いします。

4

1 に答える 1

1

いくつかの変更により、次のようなものを使用できます。

while read line; do 
  if [[ "$line" == *\$* ]]; then 
    echo $line | awk -F',|\$' '{print $1,$2,$5,$6,$3}' >> newfile;
  else
    echo $line | awk -F',' '{print $1,$2,$3,,$4,,$5}' >> newfile;
  fi
done < "/path/to/your/file"
于 2013-01-23T03:20:50.097 に答える