【问题标题】:how do I use a conditional in this one liner?我如何在这一个班轮中使用条件?
【发布时间】:2012-05-02 21:04:19
【问题描述】:

我有一个包含 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 理解的差距。

【问题讨论】:

  • 匹配永远不会成功。您的模式需要双引号字符,但您的数据不包含任何双引号字符。不要说“没用”!!告诉我们发生了什么,没有输出?输出不正确?烟从通风口冒出来?
  • 抱歉,我已经修复了双引号问题并为清晰起见进行了编辑

标签: perl


【解决方案1】:

一方面,后缀 if $a{$1} > 0 表达式首先被评估,就像你说的那样

if ($a{$1} > 0) {
    /^"[0-9]+","[0-9]+","(.+)"/ && ++$a{$1} && print "$_ $a{$1}\n"
}

$a{...}(和$1)只会在if 块内更新,因此if 语句永远不会正确。

另一方面,您的正则表达式有双引号字符,但您的示例输入没有。是不是打错字了?

【讨论】:

  • 这是一个错字,为了清楚起见,我删除了双引号。谢谢!
【解决方案2】:
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;
}'

【讨论】:

    【解决方案3】:
    perl -ne 'print "$_ $a{$1}\n" if /^[0-9]+,[0-9]+,(.+)/ && !$a{$1}++'
    

    【讨论】:

      【解决方案4】:
      perl -ne 'print if !$_{[m/([^,]*)$/]->[0]}++;'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多