Perl単行コマンド4-Numbering


注:この文章はperl-one-liners-explainedという本から書かれています.興味のある子供靴は検索して、それから購入することができます.9ドルぐらいですか.この著者にはawkとsedシリーズの単行命令書もある.
以上のすべてのテストはこのtestです.plを基準とする
#!/usr/bin/perl
use strict;
use List::MoreUtils qw(uniq);
#use Data::Dumper;
open(FD,"1.txt")||die("Can not open the file!$!n");

my $line;
while($line=){
    chomp;

    my @log=split(/####/,$line);
    $log[3] =~ s/ *$//;
    if ($log[3] eq '' ) {
        print "insert into 2car_query ( date,ip,mode,querytime) values ( \'$log[0]\',\'$log[1]\',\'$log[2]\',\'$log[4]\');
"; }else { my @operation=split(/\&/,$log[3]); @operation= uniq @operation; my %hash; foreach (@operation) { chomp; my @tmp = split (/\=/,$_); $hash{$tmp[0]} = $tmp[1]; } while (my ($key, $value) = each(%hash)) { print "$key => $value
"; push @key,$key; push @value,$value; } foreach (@key) { if (s/year/year1/) { last; } my $key_new= join ",",@key; my $value_new = join '\',\'',@value; print "insert into 2car_query ( date,ip,mode,querytime,$key) values ( \'$log[0]\',\'$log[1]\',\'$log[2]\',\'$log[4]\',\'$value\');
" } }%

1つのファイル内のすべての行番号を指定します。

perl -pe '$_ = "$. $_"' test.pl

結果:
1 #!/usr/bin/perl
2 use strict;
3 use List::MoreUtils qw(uniq);
4 #use Data::Dumper;
5 open(FD,"1.txt")||die("Can not open the file!$!n");
6
7 my $line;
8 while($line=){
9   chomp;
10
11     my @log=split(/####/,$line);
12     $log[3] =~ s/ *$//;
13     if ($log[3] eq '' ) {
14         print "insert into 2car_query ( date,ip,mode,querytime) values ( \'$log[0]\',\'$log[1]\',\'$log[2]\',\'$log[4]\');
"; 15 }else { 16 my @operation=split(/\&/,$log[3]); 17 @operation= uniq @operation; 18 19 my %hash; 20 foreach (@operation) { 21 chomp; 22 my @tmp = split (/\=/,$_); 23 24 $hash{$tmp[0]} = $tmp[1]; 25 26 27 } 28 while (my ($key, $value) = each(%hash)) { 29 30 print "$key => $value
"; 31 push @key,$key; 32 push @value,$value; 33 } 34 foreach (@key) { 35 if (s/year/year1/) { 36 last; 37 } 38 my $key_new= join ",",@key; 39 my $value_new = join '\',\'',@value; 40 print "insert into 2car_query ( date,ip,mode,querytime,$key) values ( \'$log[0]\',\'$log[1]\',\'$log[2]\',\'$log[4]\',\'$value\');
" 41 } 42 }%

空白行も番号付けされ、この文では-pパラメータの役割はtest.plをループ処理して印刷することに相当します.-eは、後述するperlプログラムとして実行される.$.は行番号を表します.$_は、現在の処理ラインを示す.上の行のプログラムの意味は$.$_の値を$_変数に与えて出力して、結果は上述のようにして、つまり行番号+プログラムの内容です

ファイル内の空白以外の行番号のみを指定します。

perl -pe '$_ = ++$a." $_" if /./' test.pl

結果は次のとおりです.
1 #!/usr/bin/perl
2 use strict;
3 use List::MoreUtils qw(uniq);
4 #use Data::Dumper;
5 open(FD,"1.txt")||die("Can not open the file!$!n");

6 my $line;
7 while($line=){
8   chomp;

9     my @log=split(/####/,$line);
10     $log[3] =~ s/ *$//;
11     if ($log[3] eq '' ) {

番号5と番号6の間の空白行が番号付けされていないことがわかります.ここではif条件文を用いて判断し,if中の条件が真である場合には$_ = ++$a." $_"という命令を実行し,偽である場合には実行しない,この命令行中のifの判断文/./はマッチングファイル中の任意の文字として作用し,改行を除いて(すなわち空行を除く),この++$aは非空行を表し,条件が一致する場合には空行を加算せず,ここで、$aの後の.はコネクタを表す.

1つのファイルでは、空でない行のみを番号付けして印刷します。

perl -ne 'print ++$a." $_" if /./' test.pl

出力結果は次のとおりです.
 #!/usr/bin/perl
2 use strict;
3 use List::MoreUtils qw(uniq);
4 #use Data::Dumper;
5 open(FD,"1.txt")||die("Can not open the file!$!n");
6 my $line;
7 while($line=){
8   chomp;
9     my @log=split(/####/,$line);
10     $log[3] =~ s/ *$//;
11     if ($log[3] eq '' ) {

空の行が出力されていないことがわかります.ここで、コマンドパラメータ-nの役割は-pのように印刷出力機能を持たないため、この文ではprintコマンドを使用してコンテンツを出力しなければならない.このprintはプログラムをループ印刷するのではなく、マッチング時に印刷するだけなので、出力はすべてマッチングされた非空行です.

1つのファイルでは、すべての行を番号付けしますが、空でない行のみを印刷します。

perl -pe '$_ = "$. $_" if /./' test.pl

出力の結果は次のとおりです.
1 #!/usr/bin/perl
2 use strict;
3 use List::MoreUtils qw(uniq);
4 #use Data::Dumper;
5 open(FD,"1.txt")||die("Can not open the file!$!n");

7 my $line;
8 while($line=){
9   chomp;

中には空行も表記されています.これは非空行に自増していないからだ.

パターンに一致する行番号を入力し、他の番号付けされていない行番号を印刷します。

perl -pe '$_ = ++$a." $_" if /#/' test.pl

結果:
1 #!/usr/bin/perl
use strict;
use List::MoreUtils qw(uniq);
2 #use Data::Dumper;
open(FD,"1.txt")||die("Can not open the file!$!n");

my $line;
while($line=){
    chomp;

3     my @log=split(/####/,$line);

パターンマッチングのみに一致する行を番号付けして印刷

perl -ne 'print ++$a." $_" if /#/' test.pl

結果:
1 #!/usr/bin/perl
2 #use Data::Dumper;
3     my @log=split(/####/,$line);

すべての行をクラシック形式で出力

perl -ne 'printf "%-5d %s", $., $_' test.pl

結果:
1     #!/usr/bin/perl
2     use strict;
3     use List::MoreUtils qw(uniq);
4     #use Data::Dumper;
5     open(FD,"1.txt")||die("Can not open the file!$!n");
6
7     my $line;
8     while($line=){
9       chomp;

1つのファイルを印刷する合計行数(wc-lに相当)

perl -lne 'END { print $. }' test.pl

結果:
42
wc -l ```` , wc-l``を使用すると、cpuがより消費され、上記の文の実行時間がより長くなります.皆さんが興味を持っているのは、いくつかのGのファイル計算を比較することができます.
このENDブロックはAWKからperlが参照した特性である.このENDブロックは、プログラムの実行が完了してから有効になります.パラメータ-lの役割は、“$.
を使用しなくてもよいように、変換動作出力の記録を使用して分割することである.もう一つ似たような方法は
perl -le 'print $n=()=<>' test.pl

これは比較的テクニックのあるコマンドラインです.perlのコンテキストの概念を知っていれば、とても分かりやすいです.このコマンドラインでは、()=<>はダイヤモンドオペレータがリストコンテキストに変換されることを引き起こす.ダイヤモンドオペレータによってファイル全体がリストに読み込まれます.次に、変数$nにリストを割り当てます.$nはスカラーであるため、リストコンテキストはスカラーコンテキストに変換されます.リストコンテキストをスカラーコンテキストに変換した結果、リストを返す要素の数になります.したがって、$n=()=<>はファイルの行数に等しい.また、これは次の文に似ています.
perl -le 'print scalar(()=<>)' test.pl

次のようなものもあります.
perl -ne '}{print $.' test.pl

パラメータ-nの役割は、while(<>) { }ループ処理プログラムに相当する.}{オペレータ(eskimo operatorこれはどのように翻訳するか分かりません.)の役割は、このループから飛び出して、次の文に相当します.
while (<>) {
}{ # eskimo operator here
print $.;
}

印刷ファイルの空でない行の数

perl -le 'print scalar(grep{/./}<>)' test.pl

結果:
37

印刷ファイル内の空白行の行数

perl -lne '$a++ if /^$/; END {print $a+0}' test.pl

結果:
5

プログラムを
perl -le 'print scalar(grep{/^$/}<>)' test.pl

まだ使えます~::
perl -le 'print ~~grep{/^$/}<>' test.pl

このオペレータは、grepがスカラーコンテキストで実行されるように2回のシフト操作を行うことに相当します.
注意:次の2つのバージョンは、ファイル全体をメモリに読み込んで操作するのに非常に効率的ではありません.最初のバージョンは行の読み取りです.

印刷ファイル内のマッチングモードに合致する行数(grep-cと等価)

perl -lne '$a++ if /regex/; END {print $a+0}' test.pl

すべての行に単語数をマークします(印刷が雑です)

perl -pe 's/(\w+)/++$i.".$1"/ge' test.pl

結果の一部は次のとおりです.
#!/1.usr/2.bin/3.perl
4.use 5.strict;
6.use 7.List::8.MoreUtils 9.qw(10.uniq);
#11.use 12.Data::13.Dumper;
14.open(15.FD,"16.1.17.txt")||18.die("19.Can 20.not 21.open 22.the 23.file!$!24.n");

25.my $26.line;
27.while($28.line=<29.FD>){
    30.chomp;

このeのパラメータの役割はperlにs/match/repl/式をコードとして実行させることである.gは全体の意味を表す.$1は、\w+が一致した結果である.

行ごとに独立した印刷単語数

perl -pe '$i=0; s/(\w+)/++$i.".$1"/ge' test.pl

結果の一部は次のとおりです.
#!/1.usr/2.bin/3.perl
1.use 2.strict;
1.use 2.List::3.MoreUtils 4.qw(5.uniq);
#1.use 2.Data::3.Dumper;
1.open(2.FD,"3.1.4.txt")||5.die("6.Can 7.not 8.open 9.the 10.file!$!11.n");

1.my $2.line;
1.while($2.line=<3.FD>){
    1.chomp;

彼らの数字の位置ですべての単語を置き換える

perl -pe 's/(\w+)/++$i/ge' test.pl

結果の一部は次のとおりです.
#!/1/2/3
4 5;
6 7::8 9(10);
#11 12::13;
14(15,"16.17")||18("19 20 21 22 23!$!24");

注意:次のシリーズは、単行コマンド計算関連です.お楽しみに.