FORTRANで作ったcatコマンドに-nオプションをつけます。
takk@deb9:~$ cat cat3.f
PROGRAM cat
CHARACTER*100 ARGS,LINE
INTEGER N
N = IARGC()
DO 11111 I=1,N
CALL GETARG(I,ARGS)
OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
1 STATUS='OLD',
2 ACCESS='SEQUENTIAL')
10 READ(10,*,END=100) LINE
WRITE(*,*) LINE
GOTO 10
100 CLOSE(10,STATUS='KEEP')
11111 CONTINUE
STOP
END
takk@deb9:~$
前回のこのプログラムのバッファサイズを100から50ぐらいにして、ターミナルで改行されず表示できるように修正しておきます。
CHARACTER*50 ARGS,LINE
行番号を表示するために必要な変数は、行番号そのものを格納する変数と、
オプションの状態を格納するフラグ、ぐらいでしょうか。
それぞれNUMとNFLAGと名付けました。
INTEGER N,NFLAG,NUM
-nが指定されたかどうかの判定は、先頭パラメータが’-n’の場合としましょう。
IF((I.EQ.1).AND.(ARGS.EQ.'-n'))
あとは行番号表示ですが、WRITEの引数を増やすだけです。
WRITE(*,*) NUM,LINE
修正したプログラムです。
takk@deb9:~$ cat cat4.f
PROGRAM cat
CHARACTER*50 ARGS,LINE
INTEGER N,NFLAG,NUM
NFLAG=0
N = IARGC()
DO 11111 I=1,N
CALL GETARG(I,ARGS)
IF((I.EQ.1).AND.(ARGS.EQ.'-n')) THEN
NFLAG=1
ELSE
NUM=1
OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
1 STATUS='OLD',
2 ACCESS='SEQUENTIAL')
10 READ(10,*,END=100) LINE
NUM=NUM+1
IF(NFLAG.EQ.1) THEN
WRITE(*,*) NUM,LINE
ELSE
WRITE(*,*) LINE
END IF
GOTO 10
100 CLOSE(10,STATUS='KEEP')
EN D IF
11111 CONTINUE
STOP
END
takk@deb9:~$
実行してみます。
takk@deb9:~$ ./a.out -n x00
2 10
3 20
4 30
5 40
6 50
7 60
8 70
9 80
10 90
11 100
takk@deb9:~$
おっと。カウントの位置を間違えました。WRITEの後じゃないといけませんね。
takk@deb9:~$ gfortran cat4.f
takk@deb9:~$ ./a.out -n x00
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
10 100
takk@deb9:~$
本物のcatと桁数を合わせたいので、cat -nを確認します。
takk@deb9:~$ cat -n x00
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
10 100
takk@deb9:~$
行番号は6桁ですね。区切り文字も空白なのかタブなのか確認しましょう。
takk@deb9:~$ cat -n x00 | od -tx1 -An -w10 20 20 20 20 20 31 09 31 30 0a 20 20 20 20 20 32 09 32 30 0a 20 20 20 20 20 33 09 33 30 0a 20 20 20 20 20 34 09 34 30 0a 20 20 20 20 20 35 09 35 30 0a 20 20 20 20 20 36 09 36 30 0a 20 20 20 20 20 37 09 37 30 0a 20 20 20 20 20 38 09 38 30 0a 20 20 20 20 20 39 09 39 30 0a 20 20 20 20 31 30 09 31 30 30 0a takk@deb9:~$
タブですね。では、cat -nの書式に合わせて、FORTRANのプログラムも改造してみます。
修正後のプログラムです。
takk@deb9:~$ cat cat4.f
PROGRAM cat
CHARACTER*50 ARGS,LINE
INTEGER N,NFLAG,NUM
NFLAG=0
N = IARGC()
DO 11111 I=1,N
CALL GETARG(I,ARGS)
IF((I.EQ.1).AND.(ARGS.EQ.'-n')) THEN
NFLAG=1
ELSE
NUM=1
OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
1 STATUS='OLD',
2 ACCESS='SEQUENTIAL')
10 READ(10,*,END=100) LINE
IF(NFLAG.EQ.1) THEN
WRITE(*,22222) NUM,LINE
ELSE
WRITE(*,33333) LINE
END IF
NUM=NUM+1
GOTO 10
100 CLOSE(10,STATUS='KEEP')
END IF
11111 CONTINUE
22222 FORMAT(I6,' ',A)
33333 FORMAT(A)
STOP
END
takk@deb9:~$
実行結果です。
takk@deb9:~$ gfortran cat4.f
takk@deb9:~$ ./a.out
takk@deb9:~$ ./a.out x00
10
20
30
40
50
60
70
80
90
100
takk@deb9:~$ ./a.out -n x00
1 10
2 20
3 30
4 40
5 50
6 60
7 70
8 80
9 90
10 100
takk@deb9:~$


コメント