我有一个像这样的文本文件
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 有什么选项吗?
最好使用 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)