有选择地删除行

时间:2012-03-30 04:47:33

标签: sed awk grep

我有一个文本文件,其中的制表符分隔数据分布在16列中。 我想删除第6列中找到值1260,1068和907的完整行。

9513    2010-06-15 17:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 18:00:02 \N
9523    2010-06-15 18:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 19:00:02 \N
9534    2010-06-15 19:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 20:00:02 \N
9543    2010-06-15 20:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 21:00:02 \N
9552    2010-06-15 21:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 22:00:02 \N
9560    2010-06-15 22:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 23:00:02 \N
9569    2010-06-15 23:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 00:00:02 \N
9579    2010-06-16 00:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 01:00:02 \N
9589    2010-06-16 01:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 02:00:01 \N
9599    2010-06-16 02:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 03:00:02 \N
95642733    2011-10-19 19:00:00 4341    0   1263    0   11  0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642732    2011-10-19 19:00:00 4341    0   1260    0   24635   0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642540    2011-10-19 19:00:00 4050    0   1068    103 113 2   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642539    2011-10-19 19:00:00 4050    0   907 19  0   0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N

4 个答案:

答案 0 :(得分:4)

Awk是您想要使用的工具。

awk '$6==1260 || $6==1068 || $6==907 {next} {print}'

这是做什么的?

Awk在文件的每一行上运行一段代码。代码以一个必须求值为true的表达式开始(在这种情况下是第六个字段的三个可能值),后面是花括号中的命令。在这种情况下,命令next告诉它进入下一个输入行而不再运行任何命令。

如果三个比较失败,而我们没有运行next,那么我们打印该行。

答案 1 :(得分:0)

您想要的是awk。 awk是UNIX中非常强大的语言,如果遇到复杂的测试流问题,awk就是你的解决方案。

试试这个脚本:

awk '{
if ($6 != 1260 || $6 != 1068 || $6 != 907)
   print $0;
}' file.txt >> output_file.txt

答案 2 :(得分:0)

这可能适合你(GNU sed?):

sed '/^\(\S*\s*\)\{5\}\(1260\|1068\|907\)\s/d' file

或一般:

sed '/^\([^[:space:]]*[[:space:]]*\)\{5\}\(1260\|1068\|907\)[[:space:]]/!d'

答案 3 :(得分:-1)

awk '$6!=1260 && $6!=1068 && $6!=907' file