删除具有特定图案的线条

时间:2017-08-08 20:46:39

标签: unix awk lines text-processing

我有一个具有此特定格式的文件:

T   11722   A   330:0:0:0:0:0   315:0:0:0:0:0
T   11723   B   0:330:0:0:0:0   0:316:0:0:0:0
T   11725   C   0:327:0:0:0:0   0:314:0:0:0:0
T   11726   D   330:0:0:0:0:0   314:0:0:0:0:0
T   11727   E   0:6:0:323:0:0   0:6:0:309:0:0
T   11728   F   0:0:0:328:0:0   0:1:0:314:0:0
T   11729   G   0:325:0:0:0:0   0:315:0:0:0:0

我想删除第4列和第5列中没有两个值的所有行。

例如,如果某一行具有特定格式:

T   11722   A   330:0:0:0:0:0   315:0:0:0:0:0

删除它。

如果它具有以下格式(第4列和第5列中每列有两个值):

T   11727   E   0:6:0:323:0:0   0:6:0:309:0:0

保持它。

因此,预期结果应为:

T   11727   E   0:6:0:323:0:0   0:6:0:309:0:0
T   11728   F   0:0:0:328:0:0   0:1:0:314:0:0

我不知道如何在unix下设置一些内容,但我猜应该有一个简单的方法。任何帮助将不胜感激。

非常感谢

2 个答案:

答案 0 :(得分:2)

awk 解决方案:

function get_count(s, c, len) { ... }
  • split(s,a,":") - 函数返回给定字符串中非零值的计数

  • s - 通过分隔符a将字符串:拆分为数组while(len--) if(a[len]){ c++ }

  • T 11727 E 0:6:0:323:0:0 0:6:0:309:0:0 T 11728 F 0:0:0:328:0:0 0:1:0:314:0:0 - 累计非零点数

输出:

{{1}}

答案 1 :(得分:2)

您是否只是尝试打印4美元或5美元中有2个或更多非零值的行?那就是:

$ awk 'gsub(/[1-9][0-9]*/,"&",$4)>1 || gsub(/[1-9][0-9]*/,"&",$5)>1' file
T 11727 E 0:6:0:323:0:0 0:6:0:309:0:0
T 11728 F 0:0:0:328:0:0 0:1:0:314:0:0