我的问题很简单:
我用过:
for file in `/path/*_aa.fasta.aln; do cut -f 1 -d "|" ${file} > ${file}.1; done`
在这里,你可以看到我的结果存储在${file}.1
,但如何做中庸之道它${file}
直接?
答案 0 :(得分:1)
尝试一下:
for file in "/path/*_aa.fasta.aln";
do
cut -f 1 -d "|" ${file} > ${file}.tmp;
mv ${file}.tmp ${file};
done
答案 1 :(得分:1)
由于无法同时读写文件,因此需要保存/缓冲输出,然后将输出(输出)保存到文件中。
例如这样的示例(此操作仅删除/添加一个尾随的空换行符):
cmd file | { buf=$(cat); printf "%s\n" "$buf" } > file
或:
temp=$(mktemp)
cmd file > "$temp"
mv "$temp" file
或者如果您有sponge可以做到这一点:
cmd file | sponge file
因此您可以:
for file in /path/*_aa.fasta.aln; do
cut -f 1 -d "|" ${file} > ${file}.1
mv ${file}.1 ${file}
done
或者如果您有sponge
:
for file in /path/*_aa.fasta.aln; do
cut -f 1 -d "|" "${file}" | sponge "${file}"
done
请注意:不要使用反引号``。使用命令替换$( ... )
。反引号已弃用,不可读,并且在嵌套时变得更加不可读。