前回作った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コマンドが出来ていきますね。


コメント