FORTRANでcutコマンド続きです。次はオプションの読み込みを行います。
-bオプションは、カンマで区切ったり、ハイフンで区切ったりして指定できますが、まだそのレベルの字句解析ができる気がしないので、-bの後の1文字だけ取得するプログラムにします。
takk@deb9:~$ cat cut2.f CHARACTER*100 ARGS,LINE INTEGER N,B B = 1 N = IARGC() DO 11111 I=1,N CALL GETARG(I,ARGS) IF( (ARGS(1:2).EQ.'-b') .AND. (I.EQ.1)) THEN READ(ARGS(3:3),*) B ELSE OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1), 1 STATUS='OLD', 2 ACCESS='SEQUENTIAL') 10 READ(10,*,END=100) LINE CALL CUT(LINE,B) GOTO 10 100 CLOSE(10,STATUS='KEEP') END IF 11111 CONTINUE STOP END SUBROUTINE CUT(LINE,B) INTEGER B CHARACTER*100 LINE 1111 WRITE(*,33333) LINE(B:B) RETURN 33333 FORMAT(A) END takk@deb9:~$
takk@deb9:~$ gfortran cut2.f takk@deb9:~$ cat x00 10010 10110 10210 10310 10410 10510 10610 10710 10810 10910 takk@deb9:~$ ./a.out -b3 x00 0 1 2 3 4 5 6 7 8 9 takk@deb9:~$ ./a.out -b1 x00 1 1 1 1 1 1 1 1 1 1 takk@deb9:~$ ./a.out -b2 x00 0 0 0 0 0 0 0 0 0 0 takk@deb9:~$
-bオプションの指定数字が1桁なら範囲指定も簡単そうです。範囲指定もできる形に改造します。
takk@deb9:~$ cat cut3.f CHARACTER*100 ARGS,LINE INTEGER N,B1,B2 B1 = 1 B2 = 1 N = IARGC() DO 11111 I=1,N CALL GETARG(I,ARGS) IF(ARGS(1:2).EQ.'-b') THEN IF(ARGS(4:4).EQ.'-') THEN READ(ARGS(3:3),*) B1 READ(ARGS(5:5),*) B2 ELSE READ(ARGS(3:3),*) B1 B2 = B1 END IF ELSE OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1), 1 STATUS='OLD', 2 ACCESS='SEQUENTIAL') 10 READ(10,*,END=100) LINE CALL CUT(LINE,B1,B2) GOTO 10 100 CLOSE(10,STATUS='KEEP') END IF 11111 CONTINUE STOP END SUBROUTINE CUT(LINE,B1,B2) INTEGER B1,B2 CHARACTER*100 LINE 1111 WRITE(*,33333) LINE(B1:B2) RETURN 33333 FORMAT(A) END takk@deb9:~$
結果です。
takk@deb9:~$ gfortran cut3.f takk@deb9:~$ cut -b2-4 x00 001 011 021 031 041 051 061 071 081 091 takk@deb9:~$ ./a.out -b2-4 x00 001 011 021 031 041 051 061 071 081 091 takk@deb9:~$
コメント