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.1和ENST00005546.9ids,理想的输出应该是:
>ENST00001234.1
ACGTACGTACGG
TTACCCAGTACG
ATCGCATTCAGC
>ENST00005546.9
TTTATCGC
TTAGGGTAT
Run Code Online (Sandbox Code Playgroud)
我试过了,awk '/ENST00001234.1/ENST00005546.9/{print}'但没有帮助。
您可以设置>为记录分隔符:
$ 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
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |