以下の様なカンマ区切りのファイルがあります。 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,: フィールドの11カラム以降からは、コロン区切りで複数設定されている場合がある ので、複数行に分けたいのです。 以下の様に、 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, に編集し、ファイルに出力したいのですが、11カラム以降の処理が上手く行きません。 3通りほど、試してみたのですが、それぞれ駄目でした。 どこがいけないのかとどうすればよいのかを教えてください。 環境は、 Solaris8、Bシェル です。 No.1 ----------------------------------------------------------------- #!/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) { m=split(lstadr,lst,":") ; return m ; } { cnt=1 ; n=split($0,arglst,",") ; for(i=11;i<=n;i++) { m=max_desc(arglst[i],lst["${i}"]) ; if (m>cnt) { cnt=m ; } } no=1 ; for(i=1; i<=cnt; i++) { for(j=1; j<=n; j++) { if (j==2) { printf("%d,",no++) >> OUT ; } else if (j==11 || j==12 || j==13 || j==14 || j==15 || j==16) { printf("%s,",lst["${j}"][i]) >> OUT ; } else { printf("%s,",arglst[j]) >> OUT ; } } printf("\n") >> OUT ; } }' ${FILE} exit 0 No.2 ----------------------------------------------------------------- #!/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) { cnt=split(lstadr,lst,":") ; return cnt ; } { num=1 ; n=split($0,arglst,",") ; for(i=11;i<=n;i++) { ret=max_desc(arglst[i],lst[++x,y]) ; if (ret>num) { num=ret ; } } nf=x ; no=1 ; for(y=1; y<=num; y++) { for(j=1; j<=10; j++) { if (j==2) { printf("%d,",no++) >> OUT ; } else { printf("%s,",arglst[j]) >> OUT ; } } for(x=1; x<=nf; x++) { printf("%s,",lst[x,y]) >> OUT ; } printf("\n") >> OUT ; } }' ${FILE} exit 0 No.3 ----------------------------------------------------------------- #!/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) { cnt=split(lstadr,arrlst,":") ; for(j=1;j<=cnt;j++) { lst[x,j]=arrlst[j] ; } return cnt ; } { num=1 ; n=split($0,arglst,",") ; for(i=11;i<=n;i++) { ret=max_desc(arglst[i],lst[++x,y],x) ; if (ret>num) { num=ret ; } } nf=x ; no=1 ; for(y=1; y<=num; y++) { for(j=1; j<=10; j++) { if (j==2) { printf("%d,",no++) >> OUT ; } else { printf("%s,",arglst[j]) >> OUT ; } } for(x=1; x<=nf; x++) { printf("%s,",lst[x,y]) >> OUT ; } printf("\n") >> OUT ; } }' ${FILE} exit 0 |