垂直 Grep 文本

use*_*r90 2 awk grep

我有一个像这样的文本文件

scaffold20  6146680 .   T   C   44.4146 .   DP=2;VDB=0.02;SGB=-0.4
scaffold20  6146696 .   G   A   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146760 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146785 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146864 .   A   C   153 .   DP=7;VDB=0.637622;SGB
scaffold20  6146867 .   G   A   11.4845 .   DP=8;VDB=0.82;SGB=-0.45
scaffold20  6146914 .   G   A   20.2676 .   DP=5;VDB=0.06;SGB=-0.45
scaffold20  6147094 .   G   A   44.4146 .   DP=2;VDB=0.44;SGB=-0.45
scaffold20  6147165 .   C   T   8.13869 .   DP=1;SGB=-0.379885;MQ0F=
scaffold20  6147166 .   A   G   8.13869 .   DP=1;SGB=-0.37
Run Code Online (Sandbox Code Playgroud)

如果第 4 列有这个序列,我需要打印

  A
  A
  G
Run Code Online (Sandbox Code Playgroud)

像这样

scaffold20  6146785 .   A   G   8.13869 .   DP=1;SGB=-0.379885;MQ0
scaffold20  6146864 .   A   C   153 .   DP=7;VDB=0.637622;SGB
scaffold20  6146867 .   G   A   11.4845 .   DP=8;VDB=0.82;SGB=-0.45
Run Code Online (Sandbox Code Playgroud)

Grep 有什么选项吗?

kva*_*our 5

最好使用 awk 在列中垂直搜索。这是一个快速的方法。

awk -v s="AAG" 'BEGIN{n=length(s);t=sprintf("%*s",n," ")}
                {b[FNR%n]=$0; t=substr(t,2)$4}
                (t==s) { for(i=1;i<=n;++i) print b[(FNR+i)%n] }' file
Run Code Online (Sandbox Code Playgroud)

当您必须搜索特定字符串时,上述方法非常有效。当你想搜索一个正则表达式时,你必须做一些不同的事情。在大文件的情况下,需要一个双通道算法:

awk -v s="ERE" '(NR==FNR){t=t $4; next}
                (e<FNR) { if match(t,s) {b=RSTART+e;e=e+RSTART+RLENGTH-1} else exit}
                (b<=FNR && FNR<=e)' file file
Run Code Online (Sandbox Code Playgroud)