首页 > 解决方案 > 有没有办法对列的一部分进行分组?

问题描述

我有一个 TAB 文件,布局如下:

1   56  .   T   C   1963    .   HaplotypeScore=3.6230;MLEAF=1.00;MQ=60.00;MQ0=0;QD=33.84;MLEAC=1;SOR=1.077
1   226 .   A   G   1600    .   HaplotypeScore=3.0421;MLEAC=1;MLEAF=1.00;MQ=59.02;MQ0=0;QD=32.00;SOR=0.954
1   670 .   A   G   2878    .   HaplotypeScore=9.0166;QD=34.24;MLEAC=1;MLEAF=1.00;MQ=60.00;MQ0=0;SOR=0.864
1   817 .   C   T   1425    .   HaplotypeScore=0.9958;MLEAC=1;MLEAF=1.00;MQ=60.00;MQ0=0;QD=26.89;SOR=0.850

我的目标是创建一个 for 循环,QD=从该列中单独提取值并生成一个 .txt 文件,如下所示:

QD=33
QD=32
QD=34
QD=26

到目前为止,我想出了这样的事情:

awk -F'[: ]' '{print $8}' 输入文件

甚至可能使用 sed 命令。但此刻我完全迷失了。

标签: shellawksed

解决方案


我认为最简单的应该是使用match的功能,awk因为位置QD是未知的。在链接https://ideone.com/EzswQj#stdin中编写和测试

awk 'match($NF,/QD=[0-9]+/){print substr($NF,RSTART,RLENGTH)}' Input_file

说明:在这里使用awk'match函数,我们可以在其中提供正则表达式,我们需要在输出中获得什么。我已经给出了QD=[0-9]+哪个将匹配字符串 QD then = 然后在最后一个字段中连续任意数量的数字。如果march匹配正则表达式,那么它将设置 2 个名为的默认变量RSTARTRLENGTH因此我正在打印从 RSTART 打印到 RLENGTH 的子字符串。

注意:根据所示示例,考虑到 QD 值每最后一列仅出现一次,如果每行有多个值,那么我们需要在上面的代码中编写一个 while 循环。


推荐阅读