删除具有特定模式的行

Remove lines with specific pattern

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

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 下设置一些东西,但我猜应该有一个简单的方法。任何帮助将不胜感激。

非常感谢

awk 解决办法:

awk 'function get_count(s, c, len) { 
         len=split(s,a,":"); while(len--) if(a[len]){ c++ } 
         return c 
     } BEGIN { FS=OFS="\t" }get_count() > 1 || get_count() > 1' file

  • 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

您是否只是想打印 $4 或 $5 中有 2 个或更多非零值的行?那将是:

$ awk 'gsub(/[1-9][0-9]*/,"&",)>1 || gsub(/[1-9][0-9]*/,"&",)>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