如果它们以相同的表达式开头,则合并文本文件中的两行

时间:2015-02-04 14:00:28

标签: linux shell

我有一个看起来像这样的文件

>Unc14086 
AGAGUUUGAU 
>Unc35443
GCACGAGAAA

因此,每一个n(n可能变化)行,下一行以">"开头,这是新信息块的开头。

我有另一个制表符分隔的文件:

Unc14806 InformationalTextExample
Unc35433 InformationalTextExampleII

我的目标是使用以">"开头的行中的信息解析第二个文件。在第一个文件中。每当匹配对出现时,我想写" InformationalTextExample"在该行中,可能由" _":

分隔
>Unc14086_InformationalTextExample
AGAGUUUGAU 
>Unc35443_InformationalTextExampleII
GCACGAGAAA 

怎么可能?

谢谢!

2 个答案:

答案 0 :(得分:1)

我会使用Perl来完成任务。我假设文件名为1.fasta1.tsv

#!/usr/bin/perl
use warnings;
use strict;

my %name_of_id;
open my $TSV, '<', '1.tsv' or die $!;
while (<$TSV>) {
    my ($id, $name) = split /\t/;
    $name_of_id{$id} = $name;
}
close $TSV;

open my $FASTA, '<', '1.fasta' or die $!;
while (<$FASTA>) {
    if (my ($id) = /^>(\S*)/) {
        if (exists $name_of_id{$id}) {
            chomp;
            print $id, '_', $name_of_id{$id};
        } else {
            warn "WARNING: $id not found!\n";
            print;
        }
    } else {
        print;
    }
}

答案 1 :(得分:1)

提供输入/输出示例以帮助人们理解您的问题和问题是很好的。但请尽量避免拼错!

看看你的例子:

>Unc14086  then Unc14806 Inf...
      ^              ^
>Unc35443  then Unf35433 Inf...
   ^              ^

无论如何,这个单行将帮助你:

 awk 'NR==FNR{a[$1]=$1"_"$2;next}sub(/^>/,"",$1){$0=">"a[$1]}7' FS="\t" f2 f1 

f2是没有>

的文件

固定拼写错误的例子:

kent$  head f2 f
==> f2 <==
Unc14086        InformationalTextExample
Unc35443        InformationalTextExampleII

==> f <==
>Unc14086
AGAGUUUGAU 
>Unc35443
GCACGAGAAA

kent$  awk 'NR==FNR{a[$1]=$1"_"$2;next}sub(/^>/,"",$1){$0=">"a[$1]}7' FS="\t" f2 f
>Unc14086_InformationalTextExample
AGAGUUUGAU 
>Unc35443_InformationalTextExampleII
GCACGAGAAA