如何使用awk进行多次匹配并在每个模式后打印不同数量的行

Ape*_*pex 1 bash awk grep bioinformatics fasta

我有一个包含数千行的大文件,如下所示:

>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00002235.4
TTACGCAT
TAGGCCAG
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)

>例如,我想 grep 特定的 id(在符号之后),ENST00001234.1然后想在匹配之后获取行直到下一个>[不管行数]。我想以这种方式一次 grep 大约 63 个 ID。

如果我 grepENST00001234.1ENST00005546.9ids,理想的输出应该是:

>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)

我试过了,awk '/ENST00001234.1/ENST00005546.9/{print}'但没有帮助。

Sun*_*eep 6

您可以设置>为记录分隔符:

$ awk -F'\n' -v RS='>' -v ORS= '$1=="ENST00001234.1"{print RS $0}' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
Run Code Online (Sandbox Code Playgroud)
  • -F'\n' 更容易将搜索词与第一行进行比较
  • -v RS='>'设置>为输入记录分隔符
  • -v ORS= 清除输出记录分隔符,否则你会在输出中得到额外的换行符
  • $1=="ENST00001234.1"这将进行字符串比较并匹配整个第一行,否则您将不得不转义正则表达式元字符.并添加锚点
  • print RS $0如果找到匹配,打印>并记录内容


如果要匹配多个搜索词,请将它们放在一个文件中:

$ cat f1
ENST00001234.1
ENST00005546.9

$ awk 'BEGIN{FS="\n"; ORS=""}
       NR==FNR{a[$0]; next}
       $1 in a{print RS $0}' f1 RS='>' ip.txt
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)

在这里, 的内容f1用于构建 array 的键a。读取第一个文件后,RS='>'将更改第二个文件的记录分隔符。

$1 in a 将检查第一行是否与数组中的键匹配 a