2

awk を使用して 2 つのファイルをマージしようとしています。最初のファイルは次のようになります

exm-IND1-200449980  1   202183358
exm-IND1-201453487  1   203186865
exm-IND10-102817747 10  102827758

ファイル2はこんな感じ

exm-IND1-200449980_ver3 -0.0676 0.9988
exm-IND1-201453487_ver1 0.0845  0.0163
exm-IND10-102817747_ver3    -0.1154 0.5166

File1 の情報に File2 の最初の列を追加したいと考えています。両方のファイルの最初の列で一致させたいのですが、「_ver3」または「_ver1」フィールドは無視します。必要なため、この情報を取り除くことはできません。

grep は正確ではない一致を見つけると思っていましたが、試してみると

grep exm-INDI1-200449980_ver3 file1

何も返されません

私が試してみました

awk 'NR==FNR{a[$1]=$0; next;}$1 in a {print a[$1]" "$1" "$2" "$3}' file2 file1 > file3

しかし、それは私に何の出力も与えていません。完全一致のみを検索しているためだと思いますか?

ファイル 2 には ~16,000 行、ファイル 1 には ~ 1,000,000 行あります。

私が探している出力は、次のようなものになります。

exm-IND1-200449980 1 202183358 exm-IND1-20449980_ver3
exm-IND1-201453487 1 203186865 exm-IND1-201453487_ver1
4

2 に答える 2

1

Perl ソリューション:

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

my %f2;
open my $F2, '<', 'file2' or die $!;
while (<$F2>) {
    my ($id, $num) = split ' ', $_, 3;
    $id =~ s/_ver[0-9]+//;
    $f2{$id} = $num;
}

open my $F1, '<', 'file1' or die $!;
while (<$F1>) {
    my ($id) = split ' ', $_, 2;
    chomp;
    print $_, "\t", $f2{$id}, "\n";
}
于 2013-09-10T08:56:24.863 に答える