フォルダ内のすべてのファイルを見つけて置き換える特別なパターン

フォルダ内のすべてのファイルを見つけて置き換える特別なパターン

次の文字列を含む共通のバイオインフォマティブ形式(FASTA)の一連のファイルがあります。1つの特殊文字 "">"、サンプル名のテキスト(文字列は長さが異なり、数字または文字を含めることができます)、および追加数字私はMac OSXでBashを使っています。

サンプル名の後のすべての数字を削除する特別なパターンを使用してテキスト文字列を見つけて置き換えたい(ここではサンプルは「Tsuc2」です)。これまで私が見つけた最良の方法は、TextEditで「数値」特殊モードを手動で使用することです。これはうまくいきますが、理想的にはforループファイルを開き、検索と置換を1つずつ実行するのではなく、フォルダ内のすべてのファイルを見つけます。私はgrepまたはsedを使用すると思います。私が持っている問題は、追加の桁数が多様で、サンプル名と削除する必要がある数字の間に区切り文字がないことです。

私の推測では

$ for FILE in *_R2.fastq.gz.fa; do sed -i 's\[b$FILE]\[0-9]\b/$FILE/g'; done

これはうまくいきません(おそらく明らかな理由によるものです)。どんなアイデアがありますか?

コメントを解決するために編集:はい、これはfastaファイルです(デフォルトでは.txtと同じですが、フォーマットは常に「>」+「サンプル名」+「ヌクレオチド配列」に従うという点で一意です。圧縮されていません。) Callスコアではなく切り捨てられたシーケンスのみを含む圧縮されたfastqファイル。

サンプル名に数字(「Tsuc2」)が含まれているため、質問を「すべての行のすべての数字を削除する」に再構成することはできません。単一のファイルから余分な数字を簡単に削除できました。私の質問は、「保持する文字数と数字がファイル間で異なり、ファイルがない場合にフォルダ内のすべてのファイルの文字列を見つけて置き換える方法」です。サンプル名パイプ表面に追加された数字と数字の間の区切り記号。 」

ここのテキストエディタは「>」をインデントとして解釈するので、ファイルレイアウトを画像として提供しましたが、下の角かっこ内に貼り付けることができます。

>Tsuc21
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTAAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
>Tsuc22
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTCAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
GATTCCCAACACTAAGCTAGGCTTAAGGGT
>Tsuc23
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCTTGTAAAAATTACAGTGGTGTTTAACGGCCGAGAACCGCC
GAGTCTCCCAAGCGAGAAAGTAAACTACTACGCTCGGAGCCACGGAGGGCCCTCCACTGATCTTGGGGGCCTGCGAGAGT
TTTTAATTAACGCTCGCAGAGGGCCCCAAC
>Tsuc24
TTAAGTTCAGCGGGTATTCCTACCTGATCCGAGGTCAACCATTAAAATTGGGGGGTTTAGCGGCTGAGAGCTGCAACACC
TAACCAAAGCGAGAAAAAAATTACTACGCTCAGAGGATATTACAGATCCGCCGTTGTATTTCAGGAACTACAATACAGTA
GATTCCCAACACTAAGCTAGGCTTAAGGGT

複数行のデータを含むFASTAファイルのイメージ。各行には、余分な数字(時には単一の数字、最大数万桁)が無限に追加されます。

ベストアンサー1

実際のファイル名を表示することでこれを調整できますが、サンプル名が常に_ファイル名の最初の文字列の前に最も長い文字列であると仮定すると、次のことができます。

for file in *_R2.fastq.gz.fa; do
   sed -i '.bak' "s/\(>${file%%_*}\).*/\1/" "$file"
done

${file%%_*}より一般的には、or構文は${var%%pattern}「文字列の終わりで最も長いパターンの発生を取り除く」ために使用されるbash文字列操作です。ここで、パターンは_*最初の_から文字列の終わりまですべてを削除し、サンプル名は残します。これ-i '.bak'により、sed変更されたすべてのファイルのバックアップコピーが作成されます。必要でない場合は使用できますが、BSD(macOSの機能)では単独では使用-i ''できません。最後に、式は保持したい部分をキャプチャして保持し、残りは削除します。-isedsed\1


増加する数字(その外観)のみを削除したい場合は、1最初のSequence ID行、22番目のSequence ID行などから削除したい場合は、次のように直接実行できます。

perl -i '.bak' -pe '$k++ if />/; s/(>.+?)$k.*/$1/' *_R2.fastq.gz.fa

秘密は、aを見るたびに$k1つを追加し、aの値より前の値を保持し、残りを削除することです。>$k

おすすめ記事