将前导零添加到awk变量

时间:2011-08-24 20:48:30

标签: bash variables awk zero pad

我在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但没有成功。非常感谢帮助。

4 个答案:

答案 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); }'