FORTRAN(cutコマンドを作るその3)

前回作ったSPLITを使って、cutコマンドの-bオプションを複数列指定できるようにします。
いきなりプログラムです。

takk@deb9:~$ cat cut5.f
      PROGRAM MAIN
        CHARACTER*100 ARGS,LINE
        CHARACTER*10 SSTRING(10)
        INTEGER N,SSIZE,COL(10)
        SSIZE = 1
        N = IARGC()
        DO 300 I=1,N
          CALL GETARG(I,ARGS)
          IF(ARGS(1:2).EQ.'-b') THEN
            CALL SPLIT(ARGS(3:),SSTRING,SSIZE)
            DO 100,J=1,SSIZE
              READ(SSTRING(J),*) COL(J)
  100       CONTINUE
          ELSE
            OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
     1      STATUS='OLD',
     2      ACCESS='SEQUENTIAL')
   10       READ(10,*,END=200) LINE
            DO 150,J=1,SSIZE
              WRITE(*,1000) LINE(COL(J):COL(J))
  150       CONTINUE
              WRITE(*,*) ''
            GOTO 10
  200       CLOSE(10,STATUS='KEEP')
          END IF
  300   CONTINUE
 1000   FORMAT(A$)
        STOP
      END


      SUBROUTINE SPLIT(SRC,DEST,SPLIT_SIZE)
        CHARACTER*100 SRC
        CHARACTER*10 DEST(10)
        INTEGER IND,S1,S2,RSLT,SPLIT_SIZE
        IND = 0
        S2=-1
        I = 1
20100   RSLT = INDEX(SRC(IND+1:),',')
        IF(RSLT.NE.0) THEN
          S1 = IND+1
          IND = IND + RSLT
          S2 = IND-1
          DEST(I) = SRC(S1:S2)
          I = I + 1
          GOTO 20100
        END IF
        DEST(I) = SRC(S2+2:)
        SPLIT_SIZE = I
        RETURN
      END
takk@deb9:~$

できました。SPLIT関数がカンマが存在しない場合の挙動がおかしかったので、S2に初期値として-2を入れています。
結果です。

takk@deb9:~$ cat x00
10010
10110
10210
10310
10410
10510
10610
10710
10810
10910
takk@deb9:~$ gfortran cut5.f -fdollar-ok
takk@deb9:~$ ./a.out -b1,2,3,4 x00
1001
1011
1021
1031
1041
1051
1061
1071
1081
1091
takk@deb9:~$ ./a.out -b2,3,4 x00
001
011
021
031
041
051
061
071
081
091
takk@deb9:~$

少しずつですがcutコマンドが出来ていきますね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA