68user's page 掲示板

Prev< No. 4579> Next  [最新発言に戻る] [過去ログ一覧]
No. 4579 # べた 2006/04/18 (火) 23:58:32
以下の様なカンマ区切りのファイルがあります。
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

Prev< No. 4579> Next  [最新発言に戻る] [過去ログ一覧]