首页 文章

Grep word在一个文件中,并使用该单词在FASTA文件中匹配,将FASTA序列添加到第一个文件

提问于
浏览
1

我想在file1中grep几个单词,并使用每个单词来grep在file2.fasta中匹配后的内容 . 然后我想将匹配后的内容添加到我用到file03中的单词,以便file03包含来自两个文件的信息 . 我的部分文件是:

文件1:

Jan12345: ID1 ID2 ... IDN1
Jan67899: ID11 ID12 ... IDN2

和Fasta文件(file2)这样:

>ID1
ABCDEFG
>ID2
HIJKLMN
>IDN1
OPQRSTU
>ID11
WXYZABC
>ID12
DEFGHIJ
>IDN2
KLMNOPQ

我想要的输出是这个例子:

Jan12345 ID1 ABCDEFG ID2 HIJKLMN ... IDN1 OPQRSTU
Jan67899: ID11 WXYZABC ID12 DEFGHIJ... IDN2 KLMNOPQ

如您所见,我只想将FASTA序列(包含在file2中)添加到file1 . 如果有人知道如何做到这一点,我将不胜感激!

3 回答

  • 1

    awk 的一种方法

    awk '
    NR==FNR && /\>/ {
        x=$0
        getline b
        a[substr(x,2)]=b
        next
    } 
    {
        for (i=2;i<=NF;i++) {
            for (k in a) {
                if ($i==k) {
                    $i=$i" "a[k]
                }
            }
        }
    }1' file2 file1
    

    单线:

    awk 'NR==FNR{NF==2?k=$2:a[k]=$1;next}{for(i=2;i<=NF;i++){for(k in a){$i=$i==k?$i OFS a[k]:$i}}}1' FS="[> ]" file{2,1}
    

    与您的样本数据一起输出:

    $ awk 'NR==FNR {NF==2?k=$2:a[k]=$1;next}{for(i=2;i<=NF;i++){for(k in a){$i=$i==k?$i OFS a[k]:$i}}}1' FS="[> ]" file{2,1}
    Jan12345: ID1 ABCDEFG ID2 HIJKLMN IDN1 OPQRSTU
    Jan67899: ID11 WXYZABC ID12 DEFGHIJ IDN2 KLMNOPQ
    
  • 2

    将fasta / file2文件读入 %h 哈希,并替换file1中的每一行,

    perl -pe 'BEGIN{open F,pop;%h=map{y|\r\n>||d;$_}<F>} s|(ID\S+)|$1 $h{$1}|g' file1 file2
    
  • 2

    用GNU sed

    丑陋的方式:

    • 步骤I:制作命令脚本
    sed -r 's#^(\S+)\s+#${x;s/^\\s\\\|>//g;p};1{s/.*/\1/;h};/\n#;h;s/\n.*//;x;s/.*\n//;:ka;s#(\S+)\s*#\\b\1\\b\\| #;H;g;s/\n(\S+).*/\1/;x;s/.*\n\S+\s*//;tka;s/\\\|\n/\/!d;$!N;H;x;s\/\\n\/ \/g;x/' file1 > file.sed
    
    • 第二步:用bash制作结果文件
    #!/bin/bash
    while read p; do 
    sed -n $p file2
    done < file.sed > file3
    

相关问题