我有一个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
答案 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