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:~$


コメント