我有一个multi-fasta序列文件(每行末尾有一个换行符):
>M3559
GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
TTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACG
CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>M9171
GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG
CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC
>M4692
GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG
CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
我想把它变成一个文件,其中每个序列都在一行中,序列名后跟tab:
>M3559 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCATTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>M9171 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCATTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC
>M4692 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCATTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
我到了简单地删除所有换行符的地步:
awk 1 ORS='' test.txt
但我现在需要在每个序列名称的开头添加一个换行符(所以用&n;代替\ n>)
tr ">" "\n"
(虽然这会删除>,理想情况下我想保留它,但这不是什么大问题)
并在序列名称后添加\ t,我可以用正则表达式捕获它。
^>M[0-9]{4}
这是我最后一点挣扎 - 如何在文件中的正则表达式字符串之后添加字符?建议将不胜感激: - )
YOT
更新:下面我将其他人建议的各种命令的输出粘贴到我的测试输入文件中。
更新2:如果您在Mac上使用gnu sed而不是默认的sed,Fredrik的答案会有效。请在Fredrik的回答中查看我的评论。
运行:
awk -v RS='\n>' -v ORS='\n>' -v OFS='' -F'\n' '{$1=$1 "\t"}1' file
在我的输入上产生:
>M3559
>GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
>TTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACG
>CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTA
>CTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTG
>>M9171
>GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
>TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG
>CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC
>ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAGCATACTTA
>CTAAAGTGTGTTAGTTAATTAATGCTTGTAGGACATAATAATAACAATTG
>>M4692
>GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
>TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG
>CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTA
>CCAAAATGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTG
跑步:
echo $(cat test.txt) | sed 's/>/\n>/2g' | sed 's/ //2g' | sed 's/ /\t/g'
什么都不产生(没有输出)。
我没有运行paste -d " " - - - - < input
因为我的输入中每个序列的行数不同。
但是跑步:
awk 'NR%4{printf $0" ";next;}1' input
产地:
>M3559 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTA CTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTG
>M9171 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA
TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAGCATACTTA CTAAAGTGTGTTAGTTAATTAATGCTTGTAGGACATAATAATAACAATTG
>M4692 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
ATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTA CCAAAATGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTG
然后运行sed 's/ \+/ /' | tr -d ' '
没有帮助......
答案 0 :(得分:1)
如果输入格式如上,您可以使用paste
$ paste -d " " - - - - < input
>M3559 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>M9171 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC
>M4692 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
或awk
:
$ awk 'NR%4{printf $0" ";next;}1' input
>M3559 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTATGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
>M9171 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTACCTC
>M4692 GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCT:CCATGCA TTTGG:TAT:TTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACG CTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
要删除空格并在ID后面加一个标签,请将所有内容传输到
sed 's/ \+/ /' | tr -d ' '
答案 1 :(得分:0)
你可以用awk做到这一点:
awk -v RS='\n>' -v ORS='\n>' -v OFS='' -F'\n' '{$1=$1 "\t"}1' file
我们的想法是将输入和输出记录分隔符设置为\n>
,将字段分隔符设置为\n
。使用此设置,第一个字段是序列名称。您所需要的只是将输出字段分隔符设置为空字符串,并在此字段的末尾附加制表符。
答案 2 :(得分:0)
这可能不是很优雅,但我认为它符合您的要求:
echo $(cat test.txt) | sed 's/>/\n>/2g' | sed 's/ //2g' | sed 's/ /\t/g'
说明:
echo $(cat test.txt)
将线性化文件
sed 's/>/\n>/2g'
- 在'\n'
之前放置'>'
(从第二次发生开始)
sed 's/ //2g'
- 将在第一次出现后删除空格
sed 's/ /\t/g'
- 替换选项卡剩余的唯一空间
让我知道它是否有效!