- 締切済み
連番ごとに印をつける
perlを用いて、1列目の数字が連番じゃなくなったら印をつけたいと思っています。 ---<data.txt>--- 1 A 1 2 2 B 5 2 3 C 2 3 4 D 4 4 10 J 5 10 11 K 6 12 13 M 2 28 ---<result.txt>--- 1 A 1 2 2 B 5 2 3 C 2 3 4 D 4 4 > 10 J 5 10 11 K 6 12 > 13 M 2 28 このようにしたのですが、いい方法はありますか? perl初心者ですがよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- namboku
- ベストアンサー率50% (2/4)
キーブレイク処理を応用すれば、以下のような方法で実行できます。 以下のスクリプトでは、1件前のデータのキー(この場合は1列目の値)を 保存しておき、入力したデータのキーと比較して差が1の場合でなければ、 「>」を出力するようにしています。 open(IN1,"data.txt"); open(OUT1,">result.txt"); $in1_key = undef; #入力キー @out = (); #出力データの配列 $sv_key = undef; #保存した入力キー while (<IN1>) { chomp($_); ($in1_key,@data) = split(" ",$_,-1); if (($sv_key ne undef) && ($sv_key ne $in1_key) && (($in1_key - $sv_key) != 1)) { print OUT1 ">\n"; } print OUT1 "$_\n"; $sv_key = $in1_key; } close(IN1); close(OUT1); なお、1件目のデータの1列目の値が必ず「1」であれば、 以下のように簡略化できます。 open(IN1,"data.txt"); open(OUT1,">result.txt"); $in1_key = undef; #入力キー @out = (); #出力データの配列 $sv_key = 0; #保存した入力キー while (<IN1>) { chomp($_); ($in1_key,@data) = split(" ",$_,-1); if (($in1_key - $sv_key) != 1) { print OUT1 ">\n"; } print OUT1 "$_\n"; $sv_key = $in1_key; } close(IN1); close(OUT1); ※入力データの区切り文字は半角スペースであることを 前提にしていますので、例えばタブ区切りなら、 ($in1_key,@data) = split(" ",$_,-1); の部分を ($in1_key,@data) = split("\t",$_,-1); に変更してください。
- Tacosan
- ベストアンサー率23% (3656/15482)
1行ずつ読み込んで, 1列目の数値が連番じゃなくなったときにしかるべく印を入れていけばいいと思います.