![](/img/trans.png)
[英]How to replace a pattern for all occurrences after a given line using Bash?
[英]How to subset all rows that mach pattern in given columns using Bash?
给定制表符分隔文件:
1 cat 1|1 0|1 0|0 0|0
2 mouse 0|1 1|1 1|1 0|0
3 horse 0|1 0|1 1|1 1|0
4 dog 0|0 0|0 0|0 0|0
5 human 0|0 0|0 0|0 0|0
如何仅对最后三列中包含一个或多个“1 | 1”的所有行进行子集化? 即子集应返回:
2 mouse 0|1 1|1 1|1 0|0
3 horse 0|1 0|1 1|1 1|0
我需要子集的文件有2500列和100000行。 第9列到第2500列包含0 | 0 1 | 1 1 | 0或0 | 1。 如何使用Bash将包含一个或多个字符串1 | 1的所有行在9到2500的任何列中进行子集化?
我努力了:
awk '/^1|1$/' dummy.vcf > dummy.vcf1
但是,这似乎不起作用。 此外,它考虑所有列而不是列9到2500。
如果有人能够提供帮助,将不胜感激!
谢谢
这可能是你想要的:
$ awk '{ for (i=4;i<=NF;i++) if ($i == "1|1") { print; next } }' file
2 mouse 0|1 1|1 1|1 0|0
3 horse 0|1 0|1 1|1 1|0
对于您的真实数据,只需更改4到9:
awk '{ for (i=9;i<=NF;i++) if ($i == "1|1") { print; next } }' file
或者给出你的样本数据:
$ awk 'match($0,/^([^\t]+\t){3}.*1\|1/)' file
2 mouse 0|1 1|1 1|1 0|0
3 horse 0|1 0|1 1|1 1|0
并为您的真实数据更改3到8。 最后一个假设只有一位数字带|
在每个领域之间,你不能有11|10
例如。
你可以使用grep:
grep $'^\([^\t]*\t\)\{7\}.*\t1|1' file
$''
将\\t
解释为标签 \\{7\\}
表示前一个标记重复七次 [^\\t]*
匹配非标签零次或多次,即列 ^
匹配一行的开头 .*
此前跟随前七列,后跟一个标签,即列后至少9列
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.