ファイル1とファイル2と一致

ファイル1とファイル2と一致

2つのファイルがあります。 File1には遺伝子相互作用(遺伝子記号)があり、他のFile2には遺伝子記号と対応するEnsembl IDがあります。

ファイル1

GeneA GeneB
GeneA GeneD
GeneC GeneB

ファイル2

GeneA    Ensembl1
GeneB    Ensembl2
GeneC    Ensembl3 

それでは、以下のような出力を持つファイルFile3が欲しいです。

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

File2 に GeneD がないため、その遺伝子の Ensembl ID が見つからない場合は、その遺伝子に NA が入力されます。誰もが実装するのに役立ちますか?

答え1

アッ解決策:

awk 'NR==FNR{ a[$1]=$2; next }
     { $1=$1 FS (($1 in a)? a[$1]:"NA"); $2=$2 FS (($2 in a)? a[$2]:"NA"); }1' File2 File1

出力:

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

答え2

perl -lane '
   @ARGV and $h{$F[0]}=$F[1],next;
   print join $", map { $_ , $h{$_} // "NA" } @F;
' File2 File1

結果

GeneA Ensembl1 GeneB Ensembl2
GeneA Ensembl1 GeneD NA
GeneC Ensembl3 GeneB Ensembl2

布材

  • まず、File2がパラメータリストからPerlに提供され、次にFile1が提供されます。
  • %hGeneA、GeneBなどのキーを使用してハッシュを構築します。 =>値はFile2のコレクションです。 File2を処理すると@ARGVに要素があるため、スカラーコンテキストの@ARGVはtrueを返します。
  • File1 の読み込み中に @ARGV は 0 に減るため、最初の行は評価されません。 2行目は、適切なマッピング変換後にスペースで連結されたフィールドを印刷します($"のデフォルト値はスペースです)。

関連情報