合并两个文件中基于相似部分的未排序行



我想知道是否有可能将基于类似部分的两个文件的信息合并在一起。file1为爆炸后序列的ID, file2包含与序列名称的前两个数字相对应的分类名称。

文件1:

>301-89_IDNAGNDJ_171582
>301-88_ALPEKDJF_119660
>301-88_ALPEKDJF_112039
...

file2:

301-89--sample1
301-88--sample2
...

输出:

>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_119660--sample2
>301-88_ALPEKDJF_112039--sample2

文件未排序,file1包含更多行,其中前两个数字类似于file2中一行中的前两个数字。我正在寻找一些关于如何做到这一点的提示/帮助,有可能这样做吗?我应该使用哪个命令或语言?

(mawk/nawk/gawk -e/-ce/-Pe) '
FNR == !_ {
_ = !  ( ___=match(FS=FNR==NR ? "[-][-]" : "[>_]", "[>-]"))
$_ = $_ 
} FNR == NR { __[$!_]="--"$NF; next } sub("$", __[$___])' file2.txt file1.txt 

———————————————————————————

>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_112039--sample2
>301-88_ALPEKDJF_119660--sample2

使用awk

$ awk -F"[_-]" 'BEGIN{OFS="-"}NR==FNR{a[$2]=$4;next}{print $0,a[$2]}' file2 OFS="--" file1
>301-89_IDNAGNDJ_171582--sample1
>301-88_ALPEKDJF_119660--sample2
>301-88_ALPEKDJF_112039--sample2

我想知道是否有可能将基于类似部分的两个文件中的信息合并在一起

是的…

文件未排序

如果我们对它们进行转换,使它们的分隔符一致,然后将它们重新格式化,则会更容易:

  1. sed 's/>([0-9]*-[0-9]*)_(.*)$/1 2/' file1产生

    301-88 ALPEKDJF_112039
    301-88 ALPEKDJF_119660
    301-89 IDNAGNDJ_171582
    ...
    

    我们可以直接通过sort -k1

  2. sed 's/--/ /' f2产生

    301-89 sample1
    301-88 sample2
    ...
    

    ,我们可以用同样的方式排序

  3. join sorted1 sorted2(使用前面步骤的排序结果)生成

    301-88 ALPEKDJF_112039 sample2
    301-88 ALPEKDJF_119660 sample2
    301-89 IDNAGNDJ_171582 sample1
    ...
    
  4. 最后,我们可以格式化这三个字段,你原来想要的,通过管道通过

    sed 's/(.*) (.*) (.*)$/1_2--3/'

如果对它们进行动态排序是合理的,我们可以使用进程替换:

$ join 
<( sed 's/>([0-9]*-[0-9]*)_(.*)$/1 2/' f1 | sort -k1 ) 
<( sed 's/--/ /' f2 | sort -k1 ) 
| sed 's/(.*) (.*) (.*)$/1_2--3/'
301-88_ALPEKDJF_112039--sample2
301-88_ALPEKDJF_119660--sample2
301-89_IDNAGNDJ_171582--sample1
...

如果对文件进行排序是不合理的-在运行中或其他情况下-您将最终在内存中构建一个散列,就像awk答案所做的那样。两个都试一试,看看哪个更快。

相关内容

  • 没有找到相关文章