2

2 つのファイルがあり、ファイル 1 は次のようになります。

rs12126768  T   0.0252778071842686
rs908742    A   -0.0175531592475892
rs3107147   A   0.0253753063312283
rs3128309   A   0.0284902703996274
rs16824948  T   0.0696193418800571
rs2643888   A   0.0452601314048646
rs3795272   T   -0.0244976316004002
rs2840531   T   -0.0438473997802763
rs10910060  A   0.0364283566135514
rs1129332   T   -0.0274739770007551

ファイル 2 は次のようになります。

1   rs908742    0   2033256
1   rs3795272   0   2284195
1   rs2840531   0   2286408
1   rs1129332   0   2336210
1   rs7512269   0   2418625
1   rs2247308   0   2445406
1   rs1980789   0   2455863
1   rs3122922   0   2456203
1   rs4648453   0   3025712
1   rs6424069   0   3147030

ファイル 1 の $1 がファイル 2 の $2 にある場合、その行を出力したいと思います。したがって、望ましい出力は次のようになります。

rs908742    A   -0.0175531592475892
rs3795272   T   -0.0244976316004002
rs2840531   T   -0.0438473997802763
rs1129332   T   -0.0274739770007551

よろしくお願いします。

4

2 に答える 2

7

このワンライナーを試してください:

awk 'NR==FNR{a[$2];next}$1 in a' file2 file1
于 2013-07-03T13:25:50.213 に答える
0

これを行うために提案するアルゴリズムは、単純なハッシュです。file2 を読み、file2 の $2 のすべてを記憶します。次に、file1 を読み取り、file1 の $1 がメモリ内にある場合は、その行を出力します。

このトリックを実行する perl スクリプトを次に示します。

use strict;
open FILE2, "file2.txt";
my %remember;
while(<FILE2>) {
    chomp $_;
    my @fields = split;
    $remember{$fields[1]} = 1;
}
open FILE1, "file1.txt";
while(<FILE1>) {
    chomp $_;
    my @fields = split;
    if(defined $remember{$fields[0]}) {
            print "$_\n";
    }
}
于 2013-07-03T13:27:41.220 に答える