行名の一部をサンプル名に置き換える

行名の一部をサンプル名に置き換える

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ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答え3

これは各ファイルを繰り返し、ファイル名の下線の前のすべてを変数に割り当て、ファイルsample>NODEforを次に置き換えます。$samplesed

for file in /path/to/files/*;do
  sample=$(echo "${file}" | sed s/_.*//)
  sed -i "s/^>NODE/${sample}/" ${file}
done

関連情報