shell - 有没有办法对列的一部分进行分组?
问题描述
我有一个 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 命令。但此刻我完全迷失了。
解决方案
我认为最简单的应该是使用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 个名为的默认变量RSTART
,RLENGTH
因此我正在打印从 RSTART 打印到 RLENGTH 的子字符串。
注意:根据所示示例,考虑到 QD 值每最后一列仅出现一次,如果每行有多个值,那么我们需要在上面的代码中编写一个 while 循环。
推荐阅读
- javascript - 向多个收件人发送电子邮件
- python - 合并两个数组并应用一个函数
- carrot2 - 使用 Carrot2 时出现 Java 堆空间错误
- php - 尝试从 PHP git pull 时出现 known_hosts 文件权限问题
- html - 具有各种搜索参数的 HTML 网页查询
- css - 添加带有路径的SVG到css类不起作用
- javascript - 我如何将这些数据放在 html 中?
- typescript - React Native / typescript中的自定义警报
- plot - 如何在 Julia Plots Backend PGFPlotsX 中获得完整的黑色刻度线?
- python-3.x - 如何使用循环按部分拆分多行列表