我在bash中的“for”循环中有以下awk命令:
awk -v pdb="$pdb" 'BEGIN {file = 1; filename = pdb"_" file ".pdb"}
/ENDMDL/ {getline; file ++; filename = pdb"_" file ".pdb"}
{print $0 > filename}' < ${pdb}.pdb
这会读取一系列名为$ pdb.pdb的文件,并将它们拆分为名为$ pdb_1.pdb,$ pdb_2.pdb,...,$ pdb_21.pdb等的文件。但是,我想生产名称为$ pdb_01.pdb,$ pdb_02.pdb,...,$ pdb_21.pdb的文件,即将填充零添加到“file”变量。
我尝试过以不同的方式使用printf但没有成功。非常感谢帮助。
答案 0 :(得分:26)
使用file
替换输出中的sprintf("%02d", file)
。
甚至是filename = sprintf("%s_%02d.pdb", pdb, file);
的整个作业。
答案 1 :(得分:23)
以下是使用awk
:
# echo 1 | awk '{ printf("%02d\n", $1) }'
01
# echo 21 | awk '{ printf("%02d\n", $1) }'
21
将%02
替换为您需要的总位数(包括零)。
答案 2 :(得分:0)
这是一个左右填充值的函数,取决于参数: zeropad(值,计数,方向)
function zeropad(s,c,d) {
if(d!="r")
d="l" # l is the default and fallback value
return sprintf("%" (d=="l"? "0" c:"") "d" (d=="r"?"%0" c-length(s) "d":""), s,"")
}
{ # test main
print zeropad($1,$2,$3)
}
一些测试:
$ cat test
2 3 l
2 4 r
2 5
a 6 r
测试:
$ awk -f program.awk test
002
2000
00002
000000
这不是完全战场测试,所以奇怪的参数可能会产生奇怪的结果。
答案 3 :(得分:0)
此操作无需使用昂贵的Enum.filter(list, &(&1 >= 3))
=> [3,4,5]
。第一个参数是要填充的字符串,第二个参数是填充后的总长度。
printf
如果您事先知道结果字符串的长度,则可以使用简化版本(例如,限制为8):
echo 722 8 | awk '{ for(c = 0; c < $2; c++) s = s"0"; s = s$1; print substr(s, 1 + length(s) - $2); }'
两种情况下的结果均为echo 722 | awk '{ s = "00000000"$1; print substr(s, 1 + length(s) - 8); }'
。