タブ区切りファイルの複数の単語を代替単語に置き換える

タブ区切りファイルの複数の単語を代替単語に置き換える

生物を表すコード(ctc、nmg、nmlなど)を含むタブ区切りのファイルがあります(File_1)。

522 ctc:CTC00972    -   506 3.20E-138   
522 nmg:Nmag_3027   -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

コードを生物名(File_2)に関連付けるタブ区切りファイルもあります。

ctc  Clostridium_tetani_E88
nla  Neisseria_lactamica
nmg  Natrialba_magadii

File_1のコードをFile_2の生物名にどのように変更しますか?

希望の出力:

522 Clostridium_tetani_E88:CTC00972 -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027     -   561 4.70E-73
522 Neisseria_lactamica:Namu_3564   -   566 1.80E-146

データセット全体には数千のコードがあり、File_1とFile_2の生物の順序が異なることに注意してください。

答え1

これは実際には、「あるファイルからルックアップテーブルを作成して別のファイルを処理するために使用する」のバリエーションにすぎず、ルックアップキーを2番目のフィールドから切り離す必要があるという欠点があります。awkたとえば、次のようにできます。

awk '
  BEGIN{OFS=FS="\t"} 
  NR==FNR {
    a[$1]=$2; next
  } 
  {
    split($2,b,":"); 
    if (b[1] in a) $2 = a[b[1]]":"b[2]
  } 1' File_2 File_1

答え2

これを行う必要がありますsed

sed '/^[a-z]*[[:cntrl:]].*/{s/[[:cntrl:]]/###/;H;d;}
 G
 s/\([a-z]*\)\(:.*\n\)\1###\([^[:cntrl:]]*\)/\3\2/
 P
 d' file_2 file_1

これは養子ですこの一般的なソリューション。どのように機能するかについては、こちらをご覧ください。

答え3

アッ方法:

awk 'NR==FNR{a[$1]=$2;next}$2 in a{$2=a[$2]":"$3;$3=""}1' File_2 FS="[ |:]" File_1

出力:

522 Clostridium_tetani_E88:CTC00972     -   506 3.20E-138   
522 Natrialba_magadii:Nmag_3027    -   561 4.70E-73
522 nml:Namu_3564   -   566 1.80E-146

2つの入力ファイルnmlとコードが一致しません。nla

関連情報