1

数日間検索しましたが、正しい答えが得られませんでした

次のような 2 つのファイルがあります。

ファイル1:

>contig-100_23331 length_200 read_count_4043 
TCAG...
>contig-100_23332 length_200 read_count_4508 
TTCA...
>contig-100_23333 length_200 read_count_184 
TTCC...

ファイル 2:

>contig-100_23331_Cov:_30.9135
>contig-100_23332_Cov:_125.591
>contig-100_23333_Cov:_5.97537

File1 の名前 (>contig... length...) の行を File2 の名前の行に置き換えたいと思います。File2 にはコンティグ名のみが含まれていることに注意してください (シーケンスはありません)。

で方法があると思いsedますが、解決策が見つかりません

前もって感謝します!

4

2 に答える 2

2

1 つの可能性は、 を使用して-scriptsedを作成し、それを で使用することです。sedFile2File1

sed 's/^\(>contig-[0-9]*_[0-9]*\)_.*/s%^\1 %& %/' File2 > sed.script
sed -f sed.script File1 > File.Out
rm -f sed.script

サンプルFile2の場合、 にはsed.script以下が含まれます。

s%^>contig-100_23331 %>contig-100_23331_Cov:_30.9135 %
s%^>contig-100_23332 %>contig-100_23332_Cov:_125.591 %
s%^>contig-100_23333 %>contig-100_23333_Cov:_5.97537 %

サンプルの場合、処理File1の出力は次のようになります。sed

>contig-100_23331_Cov:_30.9135 length_200 read_count_4043 
TCAG...
>contig-100_23332_Cov:_125.591 length_200 read_count_4508 
TTCA...
>contig-100_23333_Cov:_5.97537 length_200 read_count_184 
TTCC...

の一部のバージョンでは、スクリプトsedの 23k 行で問題が発生する場合があります。sedそれが問題になる場合は、 を生成し、それを小さなチャンク (たとえば、それぞれ 1000 行) にsed.script分割してから、チャンクごとに実行できます。それは痛いですが、必要です。歴史的に、HP-UX (HP-UX 9 や 10 などの古いバージョン) は、スクリプト内で数百のコマンドしか処理できないかなり制限されたバージョンを持っていました。splitsed -f chunksedsed

を使用していることを考えると、プロセス置換bashを使用して明示的な中間ファイルを回避できます。

sed -f <(sed 's/^\(>contig-[0-9]*_[0-9]*\)_.*/s%^\1 %& %/' File2) File1 > File.Out

ただし、その表記法を使用する前に、スクリプトを検証する必要があります。

于 2013-04-17T22:26:14.413 に答える