|
>>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 ~ /:/) {」 の判定を増やし、フィールド番号を取得できればできますか。 |
|
>>4582 zsh >>4583 べた 一応、動きます。 以下のようになるのでしょうか。 BEGIN{ FS=","; chk_col=11; } { str_head_1=$1; split_num=chk_comma_max(NF); if(split_num!=0) { str_head_2=head_string(chk_col); 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+1); print str_head_1 ",1," str_head_2; } } function chk_comma_max(chk_point) { comma_num=0; for (k=chk_col; k<=chk_point; k++) { if($k ~ /:/) { comma_num=split($k, s, ":"); break; } } return comma_num; } function head_string(chk_point) { str_buf=$3; for (k=4; k<chk_point; k++) { str_buf=sprintf("%s,%s", str_buf, $k); } return str_buf; } |
|
>>4579 べた No.1 m=max_desc(arglst[i],lst["${i}"]) ; 添え字を利用した配列でいいのかな。 あまり利用したことはないのでなんとも入れないが、こういうところで 使えないのではないでしょうか。 添え字にマッチする文字が出てきたときに、何かするのではなかった かと思います。 No.2、No.3 多次元配列の使い方がおかしいのではないかと思います。 データをセットする側が多次元配列や、アドレス渡しの戻りができて いない。たぶん、縦軸(列)の添え字の値が正しくない。 縦軸(列)の値ってちゃんととれてますか。 |
|
>>4579 べた 多次元配列の使い方が正しいか問題はありますが、書き込みがあった シェルを使用して、多次元配列で動くのを作ってみました。 一応、動きますが。 ----------------------- #!/bin/sh # if [ $# -eq 0 ]; then echo "$0 FileName" exit 1 fi FILE=$1 OUT_FILE=kekka.log rm ${OUT_FILE} > /dev/null 2>&1 nawk -v OUT=${OUT_FILE} ' function max_desc(lstadr,lst,x,y) { cnt=split(lstadr,arrlst,":"); for(y=1;y<=cnt;y++) { lst[x,y]=arrlst[y]; } return cnt; } { num=1; row=0; col=0; n=split($0,arglst,","); for(i=11;i<=n;i++) { ret=max_desc(arglst[i],lst,++row,col); if (ret>num) { num=ret; } } seqno=1; for(y=1; y<=num; y++) { for(j=1; j<=10; j++) { if (j==2) { printf("%d,",seqno++) >> OUT ; } else { printf("%s,",arglst[j]) >> OUT; } } for(x=1; x<=row; x++) { printf("%s",lst[x,y]) >> OUT; if (x!=row) { printf("%s",",") >> OUT; } } printf("\n") >> OUT; } for(x=1; x<=row; x++) { for(y=1; y<=num; y++) { delete lst[x,y]; } } }' ${FILE} exit 0 ----------------------- |
|
あるCシェルの本でファイル検査演算子「-f」の意味は 「ファイルは普通のファイル」とあるのですが、 普通の定義が分かりません。 また、逆に普通ではないファイルとはどういったもの になるのでしょうか?? ご回答頂ければ、幸いです。 宜しくお願い致します。 |
|
>>4575 ふくし もう解決されているとは思いますが一応。 Postfix に hosts を参照させるのが一番の早道かつ王道だと思いますが わたしは Postfix を知らないので、識者のいるメーリングリストなどで 質問するのがよいかと思います。 >>4587 S-MSK☆ > 「ファイルは普通のファイル」とあるのですが、 > 普通の定義が分かりません。 csh 的には、stat(2) した結果の st_mode (構造体 stat のメンバ) に対して、 通常ファイル判定マクロ S_ISREG が真を返したら、「普通」です。 では S_ISREG がどういうケースで真を返すかというと、vfs の vtype の 値が VREG であるときです (vtype はファイル作成時に決定され、ファイル システムに記録される)。 では vfs の vtype の値が VREG であるのはどういうときかというと、 ファイルシステム依存です。ただし一般的な UFS で言うと、vtype は 1. シンボリックリンク 2. ソケット 3. FIFO (名前付きパイプ) 4. デバイスファイル (キャラクタデバイス・ブロックデバイス) と 5. 通常ファイル くらいです。よって、大抵の場合 1〜4 に当てはまらないなら通常ファイル といえます。 実際は、Solaris Door とか、VxFS 圧縮ファイルとか、HP-UX のネットワーク特殊 ファイルなどわけのわからんのがありますので、プログラムとしては 「1〜4 に当てはまらない場合は通常ファイル」 などという仮定はせず、素直に -f を使いましょう。 |
|
UNIX環境のAとBというプロセス間でsocket通信を行っています。(AF_UNIX指定) 一度、ソケットをcloseして、Bが再接続(connect)するとエラーになる場合があります。 errnoが何で返却されているのかわからないのですが。 たとえばEADDRINUSE の場合の対応策を教えて下さい。 |
|
番号を昇順に並び替えて、抜けている番号を表示したく、以下の様なシェル でやってみたのですが、上手く行きません。 どうすればいいでしょうか。 Solaris8 Bシェルです。 sort test.txt | nawk -v key="" '{if(FNR!=0 && $1!=key) print $1 ; key=$1}' sort test.txt | nawk -v key="" -F"," '{if(FNR!=0 && $1-1!=key) printf("%0.4d\n",key+1); key=$1}' sort test.txt | nawk -v key="" -F"," '{if(FNR!=0 && $1!=key) printf("%0.4d\n",key+1); key=$1}' # cat test.txt 0006 0009 0004 0010 0003 結果 0001 0002 0005 0007 0008 と表示したい。 |
|
>>4591 いち nawk -v key=1 '{ for(;;){if($1!=key) {print key; key++;} else{key=$1+1; break;}} }' a.txt でできました。 |
|
>>No. 4588 68user No.4587のS-MSK☆です。 ご回答有難う御座いました。 |
|
FTP クライアントを作ってみよう (1) FTP プロトコルの概略 |
|
>管理人様 FTP クライアントを作ってみよう (1) FTP プロトコルの概略 が大変勉強になりました。ありがとうございました。 |
|
vmstatをファイルへ出力する時に、1行毎に日時を編集したいのですがうまく出来ません。AIXですと下記のスクリプトでうまくいっているのですがsoralisではどのようにしたらよいでしょうか。 vmstat $1 $2 | awk '!/kthr|---|avm/ {printf("%s | ", $0);system("date")}' >> $LOGDIR$DATE |
|
>>4596 くるみんパパ system関数が使いたいのであればnawkか/usr/xpg4/bin/awkを使用してください。 |
|
>>4597zshさん nawkで解決しました。助かりました。ありがとうございました。 |