我想知道是否有可能将基于类似部分的两个文件的信息合并在一起。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
我想知道是否有可能将基于类似部分的两个文件中的信息合并在一起
是的…
文件未排序
…
如果我们对它们进行转换,使它们的分隔符一致,然后将它们重新格式化,则会更容易:
-
sed 's/>([0-9]*-[0-9]*)_(.*)$/1 2/' file1
产生301-88 ALPEKDJF_112039 301-88 ALPEKDJF_119660 301-89 IDNAGNDJ_171582 ...
我们可以直接通过
sort -k1
-
sed 's/--/ /' f2
产生301-89 sample1 301-88 sample2 ...
,我们可以用同样的方式排序
-
join sorted1 sorted2
(使用前面步骤的排序结果)生成301-88 ALPEKDJF_112039 sample2 301-88 ALPEKDJF_119660 sample2 301-89 IDNAGNDJ_171582 sample1 ...
-
最后,我们可以格式化这三个字段,你原来想要的,通过管道通过
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
答案所做的那样。两个都试一试,看看哪个更快。