1

列番号と行番号が異なる 2 つの大きなファイルを比較し、共通の単語 ( などKJ)を含む行を出力したいと考えています。

ファイル1:

XT1 123 aa NR
XT2 444 bb GF 
XT3 666 aa KJ

ファイル2

fc KK pcn
wd CC KJ

出力

XT3 666 aa wd CC KJ

私は試しましたが、何も得られませんでした:

awk 'FNR==NR{a[$4]=$3;next}{if (a[$3])print a[$3],$0}' file1 file2

よろしくお願いいたします。

4

3 に答える 3

2

あなたが提供した限られた情報に基づいて、

my $file1 = '...';
my $file2 = '...';

my %file2;
{
   open(my $fh2, '<', $file2)
      or die("Can't open \"$file2\": $!\n');
   while (<$fh2>) {
      my @F = split;
      $file2{$F[2]} = join(' ', @F[0,1]);
   }
}

{
   open(my $fh1, '<', $file1)
      or die("Can't open \"$file1\": $!\n');
   while (<$fh1>) {
      my @F = split;
      print(join(' ', @F[0..2], $file2{$F[3]}, $F[3]), "\n")
         if $file2{$F[3]};
   }
}

私は次のことを想定しました:

  • file2行のハッシュとしてメモリに収まります。
  • キーワードは に 2 回表示されませんfile2
  • file1の 4 列目と の 3 列目を照合することのみに関心がありfile2ます。

に表示される行の順序が維持されfile1ます。

于 2012-12-12T01:01:02.367 に答える
2

あなたは近くにいました、これを試してください:

awk 'FNR==NR { a[$4]=$1 FS $2 FS $3; next } $3 in a { print a[$3], $0 }' file1 file2

結果:

XT3 666 aa wd CC KJ

簡単な説明:

「file1」で、列 1、2、および 3 を値とする配列に列 4 を追加します。

「file2」で、列 3 が配列内にあるかどうかを確認し、そうであれば、その値と現在の行を出力します。

于 2012-12-12T01:01:57.677 に答える
0

ファイルごとに単語から行番号への個別のハッシュを作成し、ファイルごとに各行を格納する配列を作成します。

次に、ファイル 1 の単語のリストを反復処理し、ファイル 2 で一致する単語を探します。一致する単語が見つかった場合は、両方のファイルでその単語の行番号を調べます。行番号を使用して、配列から「行」を取得し、一意の単語のリストを返します。

于 2012-12-12T01:00:51.247 に答える