Reputation: 165
my question is simple:
I used :
for file in `/path/*_aa.fasta.aln; do cut -f 1 -d "|" ${file} > ${file}.1; done`
Here as you can see I store the result in the ${file}.1
but how to juste do it on ${file}
directly ?
Upvotes: 0
Views: 2640
Reputation: 141493
As you can't read and write to a file sumltanously, you need to save/buffer the output, then output (the output) to the file.
Example like (this removes/adds only one trailing empty newlines):
cmd file | { buf=$(cat); printf "%s\n" "$buf" } > file
or:
temp=$(mktemp)
cmd file > "$temp"
mv "$temp" file
or if you have sponge which does exactly that:
cmd file | sponge file
So you can:
for file in /path/*_aa.fasta.aln; do
cut -f 1 -d "|" ${file} > ${file}.1
mv ${file}.1 ${file}
done
or if you have sponge
:
for file in /path/*_aa.fasta.aln; do
cut -f 1 -d "|" "${file}" | sponge "${file}"
done
Note: don't use backquotes ` `. Use command substitution $( ... )
. Backquotes are deprecated, unreadable and become more unreadable when nested.
Upvotes: 1
Reputation: 2255
Try this:
for file in "/path/*_aa.fasta.aln";
do
cut -f 1 -d "|" ${file} > ${file}.tmp;
mv ${file}.tmp ${file};
done
Upvotes: 1