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