繁体   English   中英

如何使用Bash对给定列中的mach模式的所有行进行子集化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM