【问题标题】:Delete records in a file with Null value in certain fields through Unix通过Unix删除某些字段中具有Null值的文件中的记录
【发布时间】:2012-06-22 22:31:48
【问题描述】:

我有一个管道分隔文件(示例如下),我需要删除字段 2(email)、4(mailing-id)、6(comm_id) 中具有 Null 值的记录。在此示例中,应删除第 2、3、4 行。输出应保存到另一个文件。如果 'awk' 是最佳选择,请告诉我实现此目标的方法

id|email|date|mailing-id|seg_id|comm_id|oyb_id|method
|-fabianz-@yahoo.com|2010-06-23 11:47:00|0|1234|INCLO|1000002|unknown
||2010-06-23 11:47:00|0|3984|INCLO|1000002|unknown
|-maddog-@web.md|2010-06-23 11:47:00|0||INCLO|1000002|unknown
|-mse-@hanmail.net|2010-06-23 11:47:00|0||INCLO|1000002|unknown
|-maine-mei@web.md.net|2010-06-23 11:47:00|0|454|INCLO|1000002|unknown

【问题讨论】:

  • awk 确实是您的最佳选择。你试过什么?你怎么难住了?

标签: perl bash unix sed awk


【解决方案1】:

这是一个awk 解决方案,可能会有所帮助。但是,要删除第 2、3 和 4 行,只需检查字段 2 和 5 中的空值(即不是您所说的字段 2、4 和 6)。我理解正确吗?这是awk 做你想做的事:

awk -F "|" '{ if ($2 == "" || $5 == "") next; print $0 }' file.txt > results.txt

cat results.txt:

id|email|date|mailing-id|seg_id|comm_id|oyb_id|method
|-fabianz-@yahoo.com|2010-06-23 11:47:00|0|1234|INCLO|1000002|unknown
|-maine-mei@web.md.net|2010-06-23 11:47:00|0|454|INCLO|1000002|unknown

HTH

【讨论】:

    【解决方案2】:

    Steve 是对的,给出的示例中缺少字段 2 和 5。第二行缺少电子邮件,第三行和第四行缺少 seq_id

    这是史蒂夫解决方案的略微简化版本

    awk -F "|" ' $2!="" && $5!=""' file.txt > results.txt
    

    如果第 2,4 和 6 列是重要的,则解决方案是:

    awk -F "|" ' $2!="" && $4!="" && $6!=""' file.txt > results.txt
    

    【讨论】:

      【解决方案3】:

      这可能对你有用:

       sed 'h;s/[^|]*/\n&/2;s/[^|]*/\n&/4;s/[^|]*/\n&/6;/\n|/d;x' file.txt > results.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-19
        • 2022-11-28
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多