【问题标题】:Select rows from a text file by a matching pattern in one column通过一列中的匹配模式从文本文件中选择行
【发布时间】:2013-07-02 04:46:10
【问题描述】:

我有一个格式如下的文件。

Table_name Value
Employee   0
student    50
Payroll    0
animals    20

我需要获取值非零的整行。

预期的输出是

student    50
animals    20

如果所有行的值都为零,我应该收到类似“所有值都为零”的邮件警报。

【问题讨论】:

    标签: regex perl sed awk pattern-matching


    【解决方案1】:

    这可以工作:

    $ awk '$2' file
    Table_name Value
    student    50
    animals    20
    

    如果第二个字段不是0,则条件被评估为真 - 请注意{print $0}awk 中的默认块,因此如果这是您想要执行的唯一操作,则可以省略它。

    关于邮件提醒,我认为你最好展示一些你的代码有一个参考点。

    【讨论】:

    • 不是can。应该是will
    • 我没有得到你。你的命令会给你下面的输出 0 50 0 20 对吗?我想要整行。
    • @Vignesh,该命令将给出我的答案中显示的输出。此外,如果您正在寻找免费的程序员,您最好付费,Stack Overflow 旨在帮助那些表现出一些努力的人。
    • @Vigenesh。这应该有效。您使用的是哪个版本的 awk?
    • 它解决了你的问题吗,@Vignesh?由于您是新来的,如果您的问题已经解决,请不要忘记标记此答案或接受 anubhava 的答案。您可以单击答案旁边的复选标记将其从空心切换为绿色。
    【解决方案2】:

    以下 awk 应该满足您的两个要求:

    awk 'NR>1 && $2 {nz=1;print}; END{if (!nz) print "all zeroes, send email"}' file
    
    • 您只需将print "all zeroes, send email" 替换为您的邮件发送命令即可。

    【讨论】:

      【解决方案3】:

      GNU 代码

      $sed '/\S+\s+[0]+\b/d' 文件 表名值 学生 50 动物 20 $sed -r '/\S+\s+([1-9]|[0]+[1-9])/!d' 文件 学生 50 动物 20

      【讨论】:

        【解决方案4】:

        为什么不用 perl:

        perl -ane 'print if($.!=1 && $F[1]!=0)' your_file
        

        【讨论】:

        • 我只有Unix环境
        • Perl 是标准 Unix 环境的一部分。
        【解决方案5】:

        用 awk 非常简单,

        awk -F " " '{if($2 > 0) print $0}' your_file
        

        【讨论】:

        • 这很好,但请注意,您使用的一些选项已经设置为默认值:-F " "print $0
        猜你喜欢
        • 2013-06-23
        • 2013-06-23
        • 2019-08-13
        • 1970-01-01
        • 2017-12-15
        • 2010-12-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多