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 -lne 'print"prefer     ".$_ if(/\s+[a]\s+/);print "dontprefer ".$_ if(/\s+[c]\s+/) ' your_file
于 2012-09-17T10:42:36.853 回答
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

像这样的东西怎么样:

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 -pe 's/(?=\S+\s+(a|(c))\s+)/($2&&"dont").($1&&"prefer\t")/e'
于 2012-09-17T09:16:45.090 回答
0

您似乎是在 shell 中执行此操作,因此我将提供除 perl 之外的其他一些解决方案。

首先,awk有时是一种比 perl 更简单的编程语言:

$ 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

' ^Is 是制表符。请注意,根据您的平台,您sed可能有一些选项可以让您更有效地打印选项卡(或执行其他操作)。这个 sed 脚本应该可以在任何地方工作。它的缺点还在于它匹配a或匹配该行的c 任何位置,而不仅仅是第二列。它还假设您使用空格而不是制表符来分隔字段。如果这些问题很重要,可以扩展正则表达式来处理这些问题,但他当然适用于您的示例数据。

于 2012-09-17T11:28:25.623 回答
0

我不确定这是否对您有帮助,

您可以在 linux 中使用 SED 命令与一行进行匹配并在行首添加“prefer”和“dontprefer”

于 2012-09-17T08:33:45.850 回答
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 回答