生物を表すコード(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