通过Unix删除某些字段中Null值的文件中的记录

时间:2012-06-21 21:15:51

标签: perl bash unix sed awk

我有一个Pipe分隔文件(下面的示例),我需要删除字段2(电子邮件),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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

史蒂夫是对的,给出的样本中缺少第2和第5栏。第二行的电子邮件丢失,第三行和第四行的缺少seq_id

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

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

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

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

答案 2 :(得分:0)

这可能对您有用:

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