1

たとえばファイルがあります

Car   class    rating
ford    c        ok
merc    a        Vgood
BMW     a        Toogood
kia     c         ok

「a」と「c」がそれぞれ見つかった場合、行の先頭に「prefer」と「dontprefer」を追加したいと思います。

私はこれを「a」と「c」の行を別のファイルに分けて、必要なものを追加することで行ってきました。

perl -ne '/a/ && print' file1.l > file2.l 

perl -ple 's/^/prefer/' file2.l

私は正規表現の一致ごとにこれを実行し、追加されたらすべてのファイルを結合しました。

それで、正規表現が一致するたびにファイルを変更する代わりに、同じファイルに文字列を追加する他の簡単なコードはありますか?

サンプル出力:

  .  .          Car   class    rating

dontprefer    ford    c        ok
prefer        merc    a        Vgood
prefer        BMW     a        Toogood
dontprefer    kia     c         ok
4

7 に答える 7

1

これを試して

perl -pe 's/(?=\S+\s+(a|(c))\s+)/($2&&"dont").($1&&"prefer\t")/e'
于 2012-09-17T09:16:45.090 に答える
1

このようなものはどうですか?

use strict;
use warnings;

my %prefs = (
    a => 'prefer', 
    c => 'dontprefer',
);

while (my $line = <>) {

    my $class = (split /\s+/, $line)[1];
    print $prefs{$class} if $class && $prefs{$class};
    print $line;
}
于 2012-09-17T08:29:40.207 に答える
1
$ perl -pale 'BEGIN { %tag = ( a => "prefer", c => "dontprefer" ); } $_ = "$tag{$F[1]}\t$_" if exists $tag{$F[1]};' infile > outfile
于 2012-09-17T08:41:25.303 に答える
1
perl -lne 'print"prefer     ".$_ if(/\s+[a]\s+/);print "dontprefer ".$_ if(/\s+[c]\s+/) ' your_file
于 2012-09-17T10:42:36.853 に答える
0

この正規表現を試してください:

perl -pe 's/(?=.*?\sa\s)/prefer\t$1/ && print $1'

行に「a」があるかどうかを確認するために先読みを行い、その場合は行を前の「prefer」に置き換えます。

まとめる:

perl -pe 's/(?=.*?\sa\s)/prefer\t$1/g' file1.l | perl -pe 's/(?=.*?\sc\s)/dontprefer\t$1/g' > file2.l
于 2012-09-17T08:33:04.650 に答える
0

これがあなたに役立つかどうかはわかりませんが、

LinuxでSEDコマンドを使用して、行の先頭に「prefer」と「dontprefer」を一致させて追加するための1行を使用できます。

于 2012-09-17T08:33:45.850 に答える
0

あなたはこれをシェルで行っているようですので、perl以外のいくつかの解決策を提供します。

まず、awkperlよりも単純なプログラミング言語である場合があります。

$ awk '$2=="a"{p="prefer\t"} $2=="c"{p="dontprefer"} NR==1{p="\t"} {printf("%s\t%s\n",p,$0)}' input.txt
                Car   class    rating
dontprefer      ford    c        ok
prefer          merc    a        Vgood
prefer          BMW     a        Toogood
dontprefer      kia     c         ok

次に、sed不可解ですが、ロジックを非常に狭いスペースに凝縮できます。

$ sed '1s/^/^I^I/;/ a /s/^/prefer^I^/;/ c /s/^/dontprefer^I/' input.txt
                Car   class    rating
dontprefer      ford    c        ok
prefer          merc    a        Vgood
prefer          BMW     a        Toogood
dontprefer      kia     c         ok

'は^Iタブです。プラットフォームによっては、sedタブをより効率的に印刷(または他のことを実行)できるオプションがある場合があることに注意してください。このsedスクリプトはどこでも機能するはずです。また、2番目の列だけでなく、行のどこaかと一致するという点でも問題があります。また、タブではなく、スペースのストレテックでフィールドを区切っていることも前提としています。正規表現は、これらの問題が重要な場合に処理するように拡張できますが、もちろん、彼はサンプルデータで機能します。c

于 2012-09-17T11:28:25.623 に答える