熱交換のためのawk

熱交換のためのawk

ファイル1の列1がファイル2の列5と一致する場合は、ファイル1の列1をファイル2の列1に置き換える必要があります。

ファイル1

ENSG00000237491    1     714150     745440      2       1  143562      
ENSG00000230092    1     736259     745541      2       1  143562    
ENSG00000269831    1     738532     739137      2       1  143562    
ENSG00000187634    1     860260     879955     26      20  130731 

ファイル2

AL669831.1      1       738532  739137  ENSG00000269831
SAMD11          1       860260  879955  ENSG00000187634
RP11-206L10.9   1       714150  745440  ENSG00000237491
RP11-206L10.8   1       736259  745541  ENSG00000230092

出力は次のようにする必要があります

RP11-206L10.9    1     714150     745440      2       1  143562      
RP11-206L10.8    1     736259     745541      2       1  143562    
AL669831.1       1     738532     739137      2       1  143562    
SAMD11           1     860260     879955     26      20  130731 

以下のコードを試しましたが、うまくいかず、出力は印刷されず、エラーなしですぐに停止します。

 awk 'NR==FNR{a[$1]=$1;next} $5 in a {$1=a[$1];print}' FS='\t' OFS='\t' file1.txt file2.txt  > output.txt

ありがとうございます!

ベストアンサー1

file1.txt上記のように、ファイルと編集されたバージョンを使用してfile2.txt(それで、file1.txtに$ 5を持つfile2.txtにいくつかの入力行があります):

AL157931.1      13      23551994        23552136        ENSG00000237491
HMGA1P6 13      23708313        23708703        ENSG00000230092
RNY3P4  13      23726725        23726825        ENSG00000207157

file1.txt を読み込む前に file2.txt を読み込むと、次のような出力が得られます。

$ awk 'BEGIN {FS=OFS="\t"}
       NR==FNR {a[$5]=$1; next};
       $1 in a {$1=a[$1];print}' file2.txt file1.txt 
AL157931.1      1       714150  745440  2       1       143562
HMGA1P6 1       736259  745541  2       1       143562

これがうまくいくのは、キーがfile2の$ 5で、値が同じファイルの$ 1である連想配列を構築しようとしていることに気づくことです。

次に、file1を繰り返すときに$ 1が配列のキーであることを確認します。その場合、$ 1を一致する値(つまりfile2の対応する$ 1)に置き換えて、その行を印刷します。

おすすめ記事