2つの列が最初の列のどの行とも一致しない場合は、2番目の列の対応する行をどのように比較してゼロにしますか?

2つの列が最初の列のどの行とも一致しない場合は、2番目の列の対応する行をどのように比較してゼロにしますか?

次のファイルがあります。

ファイル1:

    id1 id6
    id5 id2
    id2 id3
    id6 id500

2番目の列の内部を最初の列の内部と比較すると、2番目と1番目の列の両方にid6とid2が存在することがわかります。しかし、id3とid500は、最初の列ではなく2番目の列に存在します。最初の列には表示されないので、後者をゼロに変更したいと思います。したがって、出力は次のようになります。

出力:

id1 id6
id5 id2
id2 0
id6 0

どんな提案がありますか? 「join」でいくつかのコマンドを試しましたが、目的の結果が得られませんでした。私の実際のデータはかなり大きいです。これは小さな例です。

答え1

2段階の解決策 - 最初のステップではフィールド1のすべての値を配列に保存しa、2番目のステップでは各行を印刷し、2番目のフィールドが配列にない場合は0に設定します。a

awk 'first{a[$1]; next}; {print $1, !($2 in a)? 0: $2}' first=1 file first=0 file

答え2

#/bin/perl

use strict;
use warnings;

my  %hash;
my  @array;
my( $key, $value );

while( <ARGV> )
{
    chomp;
    @array = split '\t';    
    $hash{ $array[0] } = $array[1];
}

while(( $key, $value ) = each %hash )
{
    printf "$key\t%s\n",
        exists( $hash{ $value }) ? $value : "0";
}

しかし、「巨大な」が何を意味するのかよくわかりません。これは、データサイズに関係なくどのくらい使用するかを意味します。申し訳ありません。 POSIXコマンドタイプのソリューションをお探しの場合は、以前このフォーラムで回答したことはありません。

関連情報