ファイルのヘッダーを他のファイルの行リストに置き換える

ファイルのヘッダーを他のファイルの行リストに置き換える

約28000個のシーケンスを含むfastaファイルがあります。このシーケンスのヘッダーを別のファイルの行リストに置き換えたいと思います。例:

ファイル1:

sp|B7UM99|TIR_ECO27
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI
MLDAQTIATVKATIPLLVET..........

ファイル2:

sp|B7UM99|TIR_ECO27OS=Escherichia coli
sp|P0ACF8|HNS_ECOLI=Human
sp|P24232|HMP_ECOLI=Flavohemoprotein

希望の出力:

sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

答え1

次のように、sedコマンドとPasteコマンドを使用してこれを実行できます。

$ sed 's/$/\n/' file2 | paste -d ' ' file1 - | sed 's/^sp.* sp/sp/'
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP..... 
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........ 
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET.......... 

最初のsedは、各項目の後に空白行を追加して、貼り付ける短いファイルを準備します。これで、両方のファイルに同じ数の行とヘッダー(古いものと新しいもの)があるので、貼り付けコマンドを実行します。最後に、2番目のsedは古いヘッダーテキストを削除します。

シーケンス行には末尾のスペースがあります。削除が重要な場合は、結果を別のsedにパイプすることができます| sed 's/ $//'

答え2

GNUを介して実装sed:

$ sed -e '/^sp|/{R file2' -e 'd}' file1
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

ここで、R fileコマンド(GNU非標準拡張)はfileいいえ(標準)はパターンdスペースを捨てます。

-in位置を編集するオプションが追加されましたfile1 i

答え3

おそらく次のスクリプトが必要です。

#!/bin/bash

# Save the good lines
awk '{if($0 !~ "^sp")print > "result_1" }' < file_1
awk '{if($0 ~ "^sp")print > "result_2" }' < file_2

# Get number of lines in result_1 ( == nl in result_2 )
nl_file=$(wc -l result_1|cut -d' ' -f1)

# Prepare sorting of these files preceded by a number
seq 2 2 $(( ${nl_file} * 2 )) > numbered_file_1
seq 1 2 $(( ${nl_file} * 2 )) > numbered_file_2

# paste content of numbered_file_* and result_* side by side
paste -d ' ' numbered_file_1 result_1 > mergedfiles
paste -d ' ' numbered_file_2 result_2 >> mergedfiles

sort -n mergedfiles | sed 's/^[[:digit:]]\s\+//g'

答え4

長い年月が経っても、まだ古い質問に対する答えが出てくるのを見て嬉しいです!

おそらくawkを使用する方がはるかに簡単です。

$ awk '/sp/{getline nuhead <"file2";$0=nuhead}1' file1
sp|B7UM99|TIR_ECO27OS=Escherichia coli
MPIGNLGNNVNGNHLIPPAPP.....
sp|P0ACF8|HNS_ECOLI=Human
MSEALKILNNIRTLRAQ........
sp|P24232|HMP_ECOLI=Flavohemoprotein
MLDAQTIATVKATIPLLVET..........

関連情報