0

我有一个管道分隔文件(下面的示例),我需要删除字段 2(电子邮件)、4(邮件 ID)、6(通信 ID)中具有空值的记录。在此示例中,应删除第 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
4

3 回答 3

1

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
于 2012-06-22T14:31:48.933 回答
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

高温高压

于 2012-06-22T03:48:58.033 回答
0

This might work for you:

 sed 'h;s/[^|]*/\n&/2;s/[^|]*/\n&/4;s/[^|]*/\n&/6;/\n|/d;x' file.txt > results.txt
于 2012-06-22T05:41:12.997 回答