Reputation: 477
Hi everyone I have a lot (200 or so) files that look like this
>Sample_NameA
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
>Sample_NameB
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
I need to add a header on every file that consist on the number of samples, the number of letters (A,C,G,T) and the number one.
So for example this first file should look like this:
2 441 1
>Sample_NameA
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
>Sample_NameB
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
ACGTGTCTAGTATGCATGCATAGCTACGACTACGACTAGCATCAGCATCGACTAGCATCGACT
I was thinking of using first grep ">" to count the number of samples because every sample name is preceded by that and using the wc to count the number of characters until another >, but I couldn't manage it. In a moment I will upload my script with what I have so far, but if someone has resolved it jet I would really appreciated it.
Thanks id advance.
Upvotes: 1
Views: 165
Reputation: 247022
With full credit to @anubhava, here's a method that doesn't keep the entire file in memory:
ed file <<END
1i
$(awk '/^>/ {s++; next} s==1 {l+=length()} END {print s,l,1}' file)
.
w
q
END
Upvotes: 0
Reputation: 11603
Can't think of a way to do this with just one grep, but certainly doable with a few pipes.
e.g.
> grep -E "^>" file
2
> grep -E -v "^>" file | grep -o "[ACGT]" | wc -l
756
Upvotes: 0
Reputation: 785541
This awk can do all this in one command:
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
Upvotes: 2
Reputation: 767
#!/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"
Upvotes: 0