テキストファイルの中身を1行ずつ読み込みたいことが少なからず発生する.
今回勉強がてらに調べたため,Perl5とcshでメモとして残すことにした(未来の自分への備忘録).
cshのバージョン:tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin) options wide,nls,dl,al,kan,sm,rh,color,filec
※tcsh?
Perl5のバージョン:This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
■以下,読み込みファイル内容
ファイル名:1lineGet.txt
※白色の文字を読み込む.他の色はエディタの機能で色づけされている.
■Perl5
Perl5で実装するのは私の完全なる自己満足なので,突っ込みがあれば教えてください.
・結論(出力結果)
ファイル内容が表示されているのがわかると思います.
・ソースコード
# !/usr/bin/perl
# vim:set ts=4 sts=4 sw=4 tw=0:
use 5.010;
use strict;
use warnings;
print "今からファイル内を1行ずつ読み込み,表示する.\n";
open FILE, '<', '1lineGet.txt' or die "$!";
while ( <FILE> ) {
print;
}
close FILE;
print "END.\n";
■csh
職場で苦心した末に,スーパープログラマーにやり方を教えてもらいました.
・結論(出力結果)
問題なく表示されているのがわかると思います.
・ソースコード
# !/bin/csh -f
# vim:set ts=4 sts=4 sw=4 tw=0:
set FILE='1lineGet.txt'
echo "今からファイル内を1行ずつ読み込み,表示する."
set COUNT=`wc -l $FILE | awk '{print $1;}'`
@ i = 1
while ( $i <= $COUNT )
set line="`cat $FILE | head -$i | tail -1`"
echo "$line"
@ i++
end
echo "END."
今回の肝は2点あり,行数にてループを制御している箇所とcat
コマンドにパイプで1行読み込みが出来るように制御している箇所です.
nawk
を駆使すれば同じように出来るようですが,私の技術力が無いため,上記のようになりました.
入力ファイルを確認していただければわかると思いますが,タブ・半角スペース・諸々の記号に屈すること無く,問題なく読み込めていることに感動しました.
入力ファイルの記号は以下の通りです.
>---:Tab表示
<:行末表示
2点の肝解説
1点目:行数取得後のループ制御
wc
コマンドにて入力ファイルの行数を取得し,awk
コマンドにて行数部分のみを切り出しています.
入力ファイルと照らし合わせても37行存在していることがわかり,正しく取得できているのがわかります.
2点目:cat
コマンド
cat
コマンドだけの使い方では,全行取得してしまうため,パイプにてhead
コマンドにて1行目を取得しています.
入力ファイルの1行目だけを取得し続けるわけに行かないため,head
コマンドへの引数をwhile
でインクリメントしながら取得行数を増やしています.
このままでは1行目を37回取得することになるため,さらにtail
コマンドにて最終行のみを取得するように取得内容を抑止しています.
取得した内容を変数に入れて表示しています.
この後は,変数(ここでは$line
)を加工するなり何なりでメイン処理として使用することになります.
なぜ,ここまでめんどくさいやり方を用いているかと言えば,入力ファイルの1行にタブやスペースが入力されていた場合そこで区切られて変数に格納されてしまうため,このようなやり方にたどり着きました.
※家で再現できずorz
教えていただいた使用方法とは言え,感動したためQiitaに投稿しました.
以上です.