ファイル内のパターンの前にファイル名を書き込みます。

ファイル内のパターンの前にファイル名を書き込みます。

何千もの類似したファイルがあり、そのファイルのパターンの後にそれぞれの名前を書きたいと思います。たとえば、

**ファイル1の名前はnexus0000です。

ファイルには以下が含まれます。

>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

私はこれを得たいと思います:

nexus0000>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0000>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

**ファイル2の名前はnexus0001です。

ファイルには以下が含まれます。

>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

私はこれを得たいと思います:

nexus0001>Pseudomonas_1M
ATGATCCGCTTCGAGCAGGTCGGCAAACGCTATC
nexus0001>Pseudomonas_2M
GTGAGCTTCGAGCAGGTCGGCGAGCCGCTATC

など。

これまでは、次を使用して最初の行にのみファイル名を書き込むことができます。

for file in nexus*; do echo "$file"$"$(cat -- "$file")" > "$file"; done

助けてくれてありがとう!

答え1

sed解決策:

for f in nexus*; do sed -i "s/^>/$f&/" "$f"; done

または使用愚かなおよびinplace拡張機能(v.4.1.0から利用可能):

for f in nexus*; do awk -i inplace '/^>/{ $0=FILENAME$0 }1' "$f"; done

答え2

find . ! -name . -prune -type f -name nexus\* -exec perl -i'' -pe 's/^>/$ARGV>/' {} +

現在のディレクトリに対してのみ起動し、名前で始まる一般的なファイルを見つけ、行の先頭で見つかったfindコンテンツをファイル名+自体に置き換えて、nexusこれらの複数のファイルに対して内部編集を実行します。>

答え3

これは、Perl 1行コードを使用して簡単に行うことができます。

perl -i -pe 's/>/$ARGV$_/g' nexus*

ファイルは内部で変更されるため、-iコマンドをテストする前に-iフラグなしで実行します。

関連情報