Добавление заголовка с использованием grep и количества слов в bash

Привет всем, у меня есть много (около 200) файлов, которые выглядят так

>Sample_NameA
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
>Sample_NameB
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT

Мне нужно добавить заголовок для каждого файла, который состоит из количества образцов, количества букв (A,C,G,T) и числа один.

Так, например, этот первый файл должен выглядеть так:

2 441 1
>Sample_NameA
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
>Sample_NameB
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT

Я думал о том, чтобы использовать первый grep ">" для подсчета количества образцов, потому что каждому названию образца предшествует это, и использовать wc для подсчета количества символов до другого>, но я не смог с этим справиться. Через мгновение я буду загружать свой сценарий с тем, что у меня есть до сих пор, но если бы кто-то разрешил его, я бы очень оценил его

Спасибо, заранее.

4 ответа

Решение

Этот awk может сделать все это одной командой:

awk '{if (d) d=d RS $0; else d=$0}
      />/{s++;next}
      s==1 && /[ACGT]/{gsub(/[^ACGT]+/, ""); n+=length($0)}
      END{print s, n, "1" RS d}' file
2 441 1
>Sample_NameA
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
>Sample_NameB
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
#!/bin/bash
DATA="$1" # for readability; give /path/to/data/file as first argument to the script
SAMPLES=$(grep -c '>' "$DATA")
CHARS=$(grep -v '>' "$DATA" | wc -c)
echo "$SAMPLES $CHARS 1"
cat "$DATA"

Не могу придумать способ сделать это с помощью всего одного grep, но, безусловно, выполнимо с несколькими трубами.

например

> grep -E "^>" file 
2
> grep -E -v "^>" file | grep -o "[ACGT]" | wc -l
756

С полным уважением к @anubhava, вот метод, который не хранит весь файл в памяти:

ed file <<END
1i
$(awk '/^>/ {s++; next} s==1 {l+=length()} END {print s,l,1}' file)
.
w
q
END
Другие вопросы по тегам