FORTRAN(nlコマンドを作る)

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

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA