p1_500sc.fasta、p2_500sc.fastaという名前のサンプルがいくつかあります。各ファイルは次のようになります。
>NODE_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>NODE_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>NODE_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>NODE_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT
ご覧のとおり、NODEフレーズがあります。各ファイルのサンプル名でファイル指定子の "NODE"を変更したいと思います。p1/p2/p100...pn
p1_500sc.fastaファイルの出力は次のとおりです。
>p1_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>p1_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p1_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>p1_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT
p123_500sc.fasta ファイルの場合
>p123_2_length_456_cov_4.453333
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p123_356_length_3_cov_4.037908
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
他のサンプルでも同様です。サンプルはp1から始まり、p150に達することができます。
答え1
bash
+sed
解決策:
for f in p[0-9]*.fasta; do
pfx="${f%%_*}"
sed -i "s/^>NODE/>$pfx/" "$f"
done
pfx="${f%%_*}"
_
– 結果を変数に割り当てるまで、ファイル名の右側の部分を切り捨てます。pfx
sed -i "s/^>NODE/>$pfx/"
- 部分>NODE
文字列を変数に置き換える$pfx
答え2
GNUを使用すると、awk
単一のコマンド呼び出しでこれを実行できます。
gawk -i /usr/share/awk/inplace.awk -F_ -v OFS=_ '
BEGINFILE {
node = FILENAME
sub(".*/", "", node)
sub("_.*", "", node)
}
$1 == ">NODE" {$1 = ">" node}
{print}' ./p*_*.fasta
いずれにせよ、使用しないでください-i inplace
現在の作業ディレクトリから最初に拡張機能をgawk
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
答え3
これは各ファイルを繰り返し、ファイル名の下線の前のすべてを変数に割り当て、ファイルsample
の>NODE
forを次に置き換えます。$sample
sed
for file in /path/to/files/*;do
sample=$(echo "${file}" | sed s/_.*//)
sed -i "s/^>NODE/${sample}/" ${file}
done