我有一个文本文件,其中的制表符分隔数据分布在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
答案 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