Добавление заголовка с использованием 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