まだFORTRAN続いています。前回作ったプログラムをベースに、各行に番号をつけるnlコマンドっぽいものを作ってみます。
行番号を格納する変数はNにします。Nだとデフォルトで整数型ではないので、宣言しておきます。
takk@deb9:~$ cat nl1.f PROGRAM nl1 INTEGER N CHARACTER*100 LINE N = 1 DO READ(*,*,end=99999) LINE WRITE(*,*) N,LINE(1:INDEX(LINE,' ')) N = N + 1 END DO 99999 STOP END takk@deb9:~$ gfortran nl1.f takk@deb9:~$ seq 10 | ./a.out 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 takk@deb9:~$
nlコマンドの方を確認してみます。
takk@deb9:~$ seq 10 | nl 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 takk@deb9:~$
数字の部分6桁のようですが、セパレータは空白だったかタブだったかよく分からないので、odでダンプしてみます。
takk@deb9:~$ seq 10 | nl | od -tx1 -w9 0000000 20 20 20 20 20 31 09 31 0a 0000011 20 20 20 20 20 32 09 32 0a 0000022 20 20 20 20 20 33 09 33 0a 0000033 20 20 20 20 20 34 09 34 0a 0000044 20 20 20 20 20 35 09 35 0a 0000055 20 20 20 20 20 36 09 36 0a 0000066 20 20 20 20 20 37 09 37 0a 0000077 20 20 20 20 20 38 09 38 0a 0000110 20 20 20 20 20 39 09 39 0a 0000121 20 20 20 20 31 30 09 31 30 0000132 0a 0000133 takk@deb9:~$
09なのでタブですね。
FORTRANのプログラムの方も、6桁表示でタブ区切りに改造しましょう。
takk@deb9:~$ cat nl2.f PROGRAM nl1 INTEGER N CHARACTER*100 LINE N = 1 DO READ(*,*,end=99999) LINE WRITE(*,11111) N,LINE(1:INDEX(LINE,' ')) N = N + 1 END DO 11111 FORMAT(I6,'ここはタブです',A) 99999 STOP END takk@deb9:~$
実行してみます。
takk@deb9:~$ gfortran nl2.f takk@deb9:~$ seq 10 | ./a.out 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 takk@deb9:~$
odでも確認します。
takk@deb9:~$ !! | od -tx1 -w9 seq 10 | ./a.out | od -tx1 -w9 0000000 20 20 20 20 20 31 09 31 20 0000011 0a 20 20 20 20 20 32 09 32 0000022 20 0a 20 20 20 20 20 33 09 0000033 33 20 0a 20 20 20 20 20 34 0000044 09 34 20 0a 20 20 20 20 20 0000055 35 09 35 20 0a 20 20 20 20 0000066 20 36 09 36 20 0a 20 20 20 0000077 20 20 37 09 37 20 0a 20 20 0000110 20 20 20 38 09 38 20 0a 20 0000121 20 20 20 20 39 09 39 20 0a 0000132 20 20 20 20 31 30 09 31 30 0000143 20 0a 0000145 takk@deb9:~$
ずれてます。改行0aの前に空白20が入っているようです。
部分文字列の取得位置がずれてました。-1します。
WRITE(*,11111) N,LINE(1:INDEX(LINE,' ')-1)
変更したプログラムを実行したらぴったり合いました。
takk@deb9:~$ seq 10 | ./a.out | od -tx1 -w9 0000000 20 20 20 20 20 31 09 31 0a 0000011 20 20 20 20 20 32 09 32 0a 0000022 20 20 20 20 20 33 09 33 0a 0000033 20 20 20 20 20 34 09 34 0a 0000044 20 20 20 20 20 35 09 35 0a 0000055 20 20 20 20 20 36 09 36 0a 0000066 20 20 20 20 20 37 09 37 0a 0000077 20 20 20 20 20 38 09 38 0a 0000110 20 20 20 20 20 39 09 39 0a 0000121 20 20 20 20 31 30 09 31 30 0000132 0a 0000133 takk@deb9:~$
コメント