我有一个文件例如
Car class rating
ford c ok
merc a Vgood
BMW a Toogood
kia c ok
我想在行的开头追加'prefer'和'dontprefer',分别找到“a”和“c”。
我一直在这样做,将“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
答案 0 :(得分: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;
}
答案 1 :(得分:1)
$ perl -pale 'BEGIN { %tag = ( a => "prefer", c => "dontprefer" ); } $_ = "$tag{$F[1]}\t$_" if exists $tag{$F[1]};' infile > outfile
答案 2 :(得分:1)
试试这个
perl -pe 's/(?=\S+\s+(a|(c))\s+)/($2&&"dont").($1&&"prefer\t")/e'
答案 3 :(得分:1)
perl -lne 'print"prefer ".$_ if(/\s+[a]\s+/);print "dontprefer ".$_ if(/\s+[c]\s+/) ' your_file
答案 4 :(得分: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
答案 5 :(得分:0)
我不确定这是否对您有所帮助,
你可以在linux中使用SED命令一行进行匹配和添加 '喜欢'和'不喜欢'在线的开头
答案 6 :(得分: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
^I
是标签。请注意,根据您的平台,sed
可能包含允许您更有效地打印标签(或执行其他操作)的选项。这个sed脚本应该无处不在。它也会受到影响,因为它匹配行上的a
或c
,而不仅仅是第二列。它还假设您使用streteches of spaces来分隔字段,而不是制表符。如果它们很重要,可以扩展regexp来处理这些问题,但是他当然可以处理你的样本数据。