我有一个包含3列的输入文件,我想打印第3列未重复的行。所以如果我的输入数据如下所示:
0,1,abc
0,2,abc
0,5,xyz
我会打印:
0,1,abc
0,5,xyz
我最初从下面开始,但它没有产生任何输出。我在这方面做错了什么?
perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} && print "$_ $a{$1}\n" if $a{$1}>0'
请注意,我不是在寻找解决我问题的方法,因为我用不同的方式对其进行了编码。但我感兴趣的是为什么上述行没有达到我的预期,因为它暴露了我的perl理解中的差距。
答案 0 :(得分:2)
首先,首先评估postfix if $a{$1} > 0
表达式,就像你说的那样
if ($a{$1} > 0) {
/^"[0-9]+","[0-9]+","(.+)"/ && ++$a{$1} && print "$_ $a{$1}\n"
}
但$a{...}
(和$1
)只会在if
块内更新,因此if
语句永远不会为真。
另外,你的正则表达式有双引号字符,但你的样本输入没有。那是一个错字吗?
答案 1 :(得分:0)
perl -ne '/^[0-9]+,[0-9]+,(.+)/ && ++$a{$1} ;print "$_" if $a{$1}==1'
您发布的内容,还包括打印$ a {$ 1}的价值。 我认为那是为了调试。
我取出了“\ n”,因为已有1美元的换行符。
如果您想更改它,请在行的开头使用chomp。
虽然使用&&在一条线上是漂亮的,我认为它会 尝试在真正的格式化块中编写perl的好建议。这个会 帮助您学习更好,调试更容易。
看看你的观点,不容易看出
的真正意图print $_ if $a{$1}>0
更好的学习方法(在我看来)会有类似的东西 对此:
perl -ne '/^[0-9]+,[0-9]+,(.+)/ and do{
if ( ! exists $a{$1} ){
print "$_";
};
$a{$1}=1;
}'
答案 2 :(得分:0)
perl -ne 'print "$_ $a{$1}\n" if /^[0-9]+,[0-9]+,(.+)/ && !$a{$1}++'
答案 3 :(得分:0)
perl -ne 'print if !$_{[m/([^,]*)$/]->[0]}++;'