|
>>4579 べた これが賢いやり方とも思えませんが、一応作ってみました。 ------ $ cat a.awk BEGIN { FS=","; chk_col=11; } { if ($chk_col ~ /:/) { str_head=head_string(); split_num=split($chk_col, str_foot, ":"); for (i=1; i<=split_num; i++) { for (j=chk_col+1; j<=NF; j++) { split($j, col_buf, ":"); str_foot[i]=sprintf("%s,%s", str_foot[i], col_buf[i]); } print str_head "," str_foot[i]; } } else { print; } } function head_string() { str_buf=$1; for (k=2; k<chk_col; k++) { str_buf=sprintf("%s,%s", str_buf, $k); } return str_buf; } ------ ------ $ cat a 001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,, 002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:456,001:002,100:200,A01:A02,0:1 003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:,:,:,A01:A02,: ------ ------ $ awk -f a.awk a 001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,, 002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,001,100,A01,0 002,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,456,002,200,A02,1 003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,,,A01, 003,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,,,,A02, ------ >>4571 68user 今更ですが、Solarisでは $ echo "Apr 02 12:25:00 ===" | sort -M - logfile | \ sort -n -k2,3 | cat -n | grep "===" | awk '{print $1}' 等としないとダメみたいです。 |
|
>>4580 zsh zshさん、ありがとうございます。 一応、動いたのですが、フィールド2の値を別の 文字置き換えたいのですが、どうすればよいのですか。 ファイル11以降に「:」で区切られたデータが存在した 場合、データの数分順番に番号を振りたいのです。 なければ、デフォルトで”1”としたいのです。 ----- $ cat a 001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,, 002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:456,001:002,100:200,A01:A02,0:1 003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:,:,:,A01:A02,: ----- 結果 001,1,a3,a4,a5,a6,a7,a8,a9,a10,,,,,, 002,1,a3,a4,a5,a6,a7,a8,a9,a10,111,123,001,100,A01,0 002,2,a3,a4,a5,a6,a7,a8,a9,a10,222,456,002,200,A02,1 003,1,a3,a4,a5,a6,a7,a8,a9,a10,111,123,,,A01, 003,2,a3,a4,a5,a6,a7,a8,a9,a10,222,,,,A02, |
|
>>4581 べた 適当に直してみました。 ------ BEGIN{ FS=","; chk_col=11; } { str_head_1=$1; if($chk_col ~ /:/) { str_head_2=head_string(chk_col); split_num=split($chk_col, str_foot, ":"); for (i=1; i<=split_num; i++) { for (j=chk_col+1; j<=NF; j++) { split($j, col_buf, ":"); str_foot[i]=sprintf("%s,%s", str_foot[i], col_buf[i]); } print str_head_1 "," i "," str_head_2 "," str_foot[i]; } } else { str_head_2=head_string(NF); print str_head_1 ",1," str_head_2; } } function head_string(chk_point) { str_buf=$3; for (k=3; k<chk_point; k++) { str_buf=sprintf("%s,%s", str_buf, $k); } return str_buf; } ------ |
|
>>4582 zsh zshさん、ありがとうございます。 >str_head_2=head_string(NF+1); >for (k=4; k<chk_point; k++) { の行を修正したら期待する結果が得られました。 ただ、ファイルのフォーマットに規則性がないことがわかり、 データによっては、正しく出力されないものがでてきました。 フィールド11に、「:」が存在しないデータがあるのです。 a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,SSS,A01,,: a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,123:456:789:100:100,A01:A02:A03:3A:NTT0001, 「 if($chk_col ~ /:/) {」 の判定を増やし、フィールド番号を取得できればできますか。 |