我正在尝试将标题{out1.hmm,out2.hmm,...,outn.hmm}的文件转换为基于文件第三行的唯一标识符{PF12574.hmm,PF09847.hmm, PF0024.hmm}该脚本适用于单个文件,但运行以下命令后该变量不会被覆盖,只剩下一个文件:
for f in *.hmm;
do output="$(sed -n '3p' < $f |
awk -F ' ' '{print $2}' |
cut -f1 -d '.' | cat)" |
mv $f "${output}".hmm; done;
第一行将所有outn.hmms作为输入调用。第二行设置变量以返回所需的唯一标识符。 SED,AWK和CUT用于获取唯一标识符。该变量应该通过唯一标识符重命名当前文件,但变量保持锁定并覆盖以前的文件。
out1.hmm out2.hmm out3.hmm 变为 PF12574.hmm
如何覆盖变量以获得以下文件结构:
out1.hmm out2.hmm out3.hmm 变为 PF12574.hmm PF09847.hmm PF0024.hmm
答案 0 :(得分:1)
您正在将赋值语句的空输出(名为“output”的变量)传递给mv
命令。该变量尚未设置,所以我认为将会 - 一个接一个地将所有匹配* .hmm的文件重命名为名为“.hmm”的文件。
尝试ls -a
,看看实际发生的是什么。
sed
,awk
,cut
和(不需要的)cat
有点多了。 awk
可以满足您的所有需求。然后将mv
作为单独的命令执行:
for f in *.hmm
do
output=$(awk 'NR == 3 {print $2}' "$f")
mv "$f" "${output%.*}.hmm"
done
请注意,上述内容不会进行任何检查以验证output
是否已分配给合理的值:非空的,即正确的“标识符”等。