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