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

旧2-5. Fortran毎日学習

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

コメント

タイトルとURLをコピーしました