Awk 比较两个文件(fasta和txt),如果匹配,则使用txt文件中的值作为fasta头的前缀

Awk 比较两个文件(fasta和txt),如果匹配,则使用txt文件中的值作为fasta头的前缀,awk,sed,bioinformatics,fasta,Awk,Sed,Bioinformatics,Fasta,我想根据参考文本文件中的信息更改我的FASTA标题。假设我有两个文件: file1.txt(参考,制表符分隔) file2.fasta >chr1:100-1000(+) TTTTGAGAGGACTTCTCTGAGAGCTATGCTAGTCATCGAGGGGAAA >chr2:30-400(-) GGGGGGAGAGAGATCTCTGAGCTAGTCATCGTAGCTAGTCATGGGG >chr3:50-4500(+) ATGCGCGAGCGAGCGCGACGATCATCGT

我想根据参考文本文件中的信息更改我的FASTA标题。假设我有两个文件:

file1.txt(参考,制表符分隔)

file2.fasta

>chr1:100-1000(+)
TTTTGAGAGGACTTCTCTGAGAGCTATGCTAGTCATCGAGGGGAAA
>chr2:30-400(-)
GGGGGGAGAGAGATCTCTGAGCTAGTCATCGTAGCTAGTCATGGGG
>chr3:50-4500(+)
ATGCGCGAGCGAGCGCGACGATCATCGTAGCTACAAAAAAAAAAAG
>chr4:60-800(-)
AGTCTAGCTATCGTAGCTGATCGTAGCTAGCTGATCGTAGCTAGTC
我想使用file1.txt中的$1来标识file2.fasta中相应的头。如果存在匹配项,请在当前标题前加上file1.txt中的$2。因此,期望的输出是:

output.fasta

>ORF1_ORF2_chr1:100-1000(+)
TTTTGAGAGGACTTCTCTGAGAGCTATGCTAGTCATCGAGGGGAAA
>ORF2_chr2:30-400(-)
GGGGGGAGAGAGATCTCTGAGCTAGTCATCGTAGCTAGTCATGGGG
>chr3:50-4500(+)
ATGCGCGAGCGAGCGCGACGATCATCGTAGCTACAAAAAAAAAAAG
>ORF1_chr4:60-800(-)
AGTCTAGCTATCGTAGCTGATCGTAGCTAGCTGATCGTAGCTAGTC
我过去曾使用awk比较两个文件中的列,但对于如何将文本文件与fasta文件(其中有标题和序列而不是列)进行比较,我感到困惑。任何帮助都会很好

$ awk 'NR==FNR{m[">"$1]=$2;next} {sub(/^>/,"&"m[$0])} 1' file1 file2
>ORF1_ORF2_chr1:100-1000(+)
TTTTGAGAGGACTTCTCTGAGAGCTATGCTAGTCATCGAGGGGAAA
>ORF2_chr2:30-400(-)
GGGGGGAGAGAGATCTCTGAGCTAGTCATCGTAGCTAGTCATGGGG
>chr3:50-4500(+)
ATGCGCGAGCGAGCGCGACGATCATCGTAGCTACAAAAAAAAAAAG
>ORF1_chr4:60-800(-)
AGTCTAGCTATCGTAGCTGATCGTAGCTAGCTGATCGTAGCTAGTC

上面假设file1中的$2不能包含
&

为什么会有python和bash标记?请删除不相关的标签。哦,拜托。我没有提到sed标签,但您没有使用sed。请运用头脑和普通礼貌。我并不是想把问题局限于awk解决方案(类似的问题似乎已经用sed等解决了,因此使用了标志)。^^^同意。我只是匆忙地编造了答案。删除了注释,因为它暗示了一种不好的做法…这几乎是完美的,只是它将值(或f1_uuu1;etc)放在“>”之前,从而损坏了标题。我现在正在玩它,试图改变它(没有对它进行后期处理)。我修改了它,把它放在
后面。非常感谢:)如果你不介意另一个愚蠢的问题,那么
^
子(/^>/
)中的作用是什么?我在没有这个的情况下尝试过它(例如,
/
)它似乎做了同样的事情
^
是字符串元字符的regexp开头。在这种情况下,由于所讨论的字符串是一整行,它将
regexp锚定到行的开头。如果这是
可以出现的唯一位置,那么您不需要它。字符串元字符的等效结尾是
$
,通常用于行尾匹配,尤其是在sed和grep中,因为它们是面向行的。
$ awk 'NR==FNR{m[">"$1]=$2;next} {sub(/^>/,"&"m[$0])} 1' file1 file2
>ORF1_ORF2_chr1:100-1000(+)
TTTTGAGAGGACTTCTCTGAGAGCTATGCTAGTCATCGAGGGGAAA
>ORF2_chr2:30-400(-)
GGGGGGAGAGAGATCTCTGAGCTAGTCATCGTAGCTAGTCATGGGG
>chr3:50-4500(+)
ATGCGCGAGCGAGCGCGACGATCATCGTAGCTACAAAAAAAAAAAG
>ORF1_chr4:60-800(-)
AGTCTAGCTATCGTAGCTGATCGTAGCTAGCTGATCGTAGCTAGTC