以下を含む入力ファイルがあります。
000ABCDEFGHIJKLMN2018022623595900021
CGT11~|~|110~|~|221~|~|H0331~|~|~|~|
CGT11~|~|110~|~|222~|~|H0332~|~|~|~|
CGT11~|~|110~|~|223~|~|H0335~|~|~|~|
CGT11~|~|110~|~|224~|~|H0333~|~|~|~|
99800000000000000011~|~|~|~|~|~|~|~|
行数を数えてファイルの最後の行に行き、「999」を確認したいと思います。一致する場合は次の手順に進み、一致しない場合はエラーメッセージが表示されます。現在、私の入力ファイルの最後の行に「998」があるため、エラーメッセージが表示されます。 Perlでこれをどのように実行できますか?誰でもこの問題を解決するのに役立ちますか?
私の現在のコードは次のとおりです。
#!/usr/bin/perl
open(FILE, "<deep.txt") or die "Could not open file: $!";
my $lines = 0;
while (<FILE>) {
$lines++;
if($Number =~ m/\d{1,3}/){
$N = $Number;
print "$N";
}
}
print "The no of lines present is $lines \n";
答え1
完全にはわかりませんが、役に立ちます。
#!/usr/bin/perl
use strict;
use warnings;
my $fname = "deep.txt";
open(my $fh, "<:encoding(ASCII)", $fname) || die "cannot open $fname for reading";
my $num = 0;
while(<$fh>)
{
$num = substr $_, 0, 3 if eof;
}
close($fh) || warn "cannot close $fname";
print "Oops, last line doesn't start with 999!\n" if $num != 999;
このeof
チェックは、読んでいるファイルの最後の行であることを確認するのに役立ちます。
whileループを1行に減らすこともできます。
eof and $num = substr $_, 0, 3 while(<$fh>);
追加資料:
答え2
使用awk
:
awk 'END { if ($0 !~ /^999/) print "error"; else printf("Lines in file: %d\n", NR) }' file
ファイルの最後の行が999
この文字列で始まらない場合にerror
表示されます。それ以外の場合は、ファイルの行数が短いメッセージで表示されます。
Perlも同様です。
perl -ne '$line=$_; END { if ($line !~ /^999/) { print "error\n" } else { printf "Lines in file: %d\n", $. } }' file
スクリプト(美しい):
$line = $_;
END {
if ( $line !~ /^999/ ) { print "error\n" }
else { printf "Lines in file: %d\n", $. }
}
$line
現在の入力ラインを設定します。
END
このブロックは、入力ができなくなったときに実行されます。最後の項目が次$line
から始まるかどうかをテストし999
、エラーまたは行番号を印刷します。この変数は、in(読み込まれた行/レコード数)$.
に対応する特別なPerl変数です。NR
awk