awk 用多个分隔符打印文件中的行

awk 用多个分隔符打印文件中的行

我有一个如下所示的文件:

chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1355707 .   G   T   .   .   DP=69;ECNT=1;NLOD=4.51  GT:AD:AF:F1R2   0/1:50,3:0.059:20,3
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4
chr1    2550056 .   TC  CT  .   .   DP=99;ECNT=1;NLOD=9.03  GT:AD:AF:F1R2   0/1:63,2:0.053:33,2

我想打印第 10 列中的第三个值大于 0.06 的行。

cat file.txt | cut -f 10 | cut -f 3 | awk -F':' '$3>0.06'

只会给我:

0/1:37,2:0.063:13,0
0/1:30,2:0.089:12,4

我想要整条线。用awk可以做到吗?

答案1

一旦您开始丢弃管道中的数据(确实如此cut),您就无法在同一管道的后续阶段将其取回。

反而,

$ awk 'split($10,a,":") && a[3] > 0.06' file
chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4

这需要第 10 个空格分隔的字段并将其按冒号分割到数组中a。如果split()中生成的任何元素a并且 的第三个元素a大于 0.06,则打印原始行。

如果文件中的字段以制表符分隔并且任何字段包含空格,则使用-F '\t'withawk确保它正确找到正确的字段(据我所知,给定的示例数据不存在任何此类问题)。


寻址评论中的后续问题:

awk 'split($10,a,":") && a[3] > 0.06 && split($11,b,":") && b[3] > 0.01' file

答案2

awk -F':' '$(NF-1) > 0.06 {print $0}' file

只需使用“:”作为分隔符并评估倒数第二列

答案3

阅读评论后,很明显您的示例数据与实际数据不匹配(并且它首先使用空格而不是制表符,这意味着即使您自己设备的命令输出也无法工作),但是已经拼凑在一起一个不同的输入文件,如下所示:

cat file.txt
chr1    1197592 .       C       A       .       .       DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0     0/1:37,2:0.0005:13,0
chr1    1355707 .       G       T       .       .       DP=69;ECNT=1;NLOD=4.51  GT:AD:AF:F1R2   0/1:50,3:0.059:20,3     0/1:50,3:0.0005:20,3
chr1    1641723 .       TC      T       .       .       DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4     0/1:30,2:0.0015:12,4
chr1    2550056 .       TC      CT      .       .       DP=99;ECNT=1;NLOD=9.03  GT:AD:AF:F1R2   0/1:63,2:0.053:33,2     0/1:63,2:0.0005:33,2

然后这将输出所有匹配的行两个都状况:

awk -F"[  :]" '$15>0.06 && $19>0.001' file.txt
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4 0/1:30,2:0.0015:12,4

答案4

我使用下面的方法来达到结果

for  i in `awk  '{print $NF}' file.txt | awk -F ":" '$3>"0.06"{print $0}'`; do awk -v i="$i" '$NF ==i{print $0}' file.txt ;done

输出

chr1    1197592 .   C   A   .   .   DP=67;ECNT=1;NLOD=8.12  GT:AD:AF:F1R2   0/1:37,2:0.063:13,0
chr1    1641723 .   TC  T   .   .   DP=59;ECNT=1;NLOD=2.40  GT:AD:AF:F1R2   0/1:30,2:0.089:12,4
[root@praveen_linux_example ~]#

相关内容