Добавить ведущие нули в переменную awk - PullRequest
18 голосов
/ 25 августа 2011

У меня есть следующая команда awk в цикле "for" в bash:

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 ]

27 голосов
/ 25 августа 2011

Заменить file на выходе sprintf("%02d", file).

Или даже целое значение filename = sprintf("%s_%02d.pdb", pdb, file);.

25 голосов
/ 25 августа 2011

Вот как создать начальные нули с помощью awk:

# echo 1 | awk '{ printf("%02d\n", $1) }'
01
# echo 21 | awk '{ printf("%02d\n", $1) }'
21

Замените %02 на общее количество нужных вам цифр (включая нули).

1 голос
/ 20 марта 2019

Это делает это без курорта printf, что дорого. Первый параметр - это строка для заполнения, второй - общая длина после заполнения.

echo 722 8 | awk '{ for(c = 0; c < $2; c++) s = s"0"; s = s$1; print substr(s, 1 + length(s) - $2); }'

Если вы заранее знаете длину строки результата, вы можете использовать упрощенную версию (скажем, 8 - ваш предел):

echo 722 | awk '{ s = "00000000"$1; print substr(s, 1 + length(s) - 8); }'

Результат в обоих случаях: 00000722.

0 голосов
/ 06 августа 2017

Вот функция, которая задает значения влево или вправо с нулями в зависимости от параметров: 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

Это не полностью проверено поле битвы, поэтому странные параметры могут дать странные результаты.

...