删除具有特定模式的行
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
我有一个特定格式的文件:
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,":")
- 通过分隔符:
将字符串 while(len--) if(a[len]){ c++ }
- 累积非零计数
s
拆分为数组 a
输出:
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