Иногда необходимо привести строки или числа разной длины к определённому стандарту, например, сделать так, чтобы они содержали одинаковое количество символов. В этом случае, если строка короче необходимой длины, вначале нужно добавить нули. Данная статья опишет, как это сделать. Показанные ниже способы в большей части одинаково работают как для чисел, так и для не-числовых строк, длину которых нужно дополнить до одинакового размера.
С помощью awk и printf
Имеется тестовый файл testfile:
cat testfile
Со следующим содержимым:
235 25 1 963258 45 1356924
Тогда команда для дополнения нулей ко всем числам до 7 символов:
awk '{printf("%07d\n", $1)}' testfile
Вывод:
0000235 0000025 0000001 0963258 0000045 1356924
Количество нулей указывается во фрагменте «%07d», чтобы изменить их количество, поменяйте цифру 7 на любую другую, например, чтобы увеличить до 8 символов:
awk '{printf("%08d\n", $1)}' testfile
Чтобы увеличить до 12 символов, заполнив недостающее нулями:
awk '{printf("%012d\n", $1)}' testfile
Связанная статья: Инструкция по использованию printf в Bash для форматирования и вывода данных
С помощью PERL
Заполнение строки нулями до определённого размера с помощью PERL:
perl -ne 'printf("%07d\n", $_)' testfile
Как и в предыдущем разделе, можно указать любое количество символов, до которых нужно заполнить нули:
perl -ne 'printf("%014d\n", $_)' testfile
Универсальный способ
Рассмотренные выше способы хотя и работают хорошо с числами до определённой длины (например, они не будут работать с цифрами, содержащими большое количество символов — больше ≈ 30 символов). К тому же, при попытке использовать другие символы, кроме нулей, могут возникнуть проблемы.
Следующим способ чуть сложнее, но является абсолютно универсальным:
- позволяет работать с цифрами и строками любой длины
- позволяет использовать не только числа, но и произвольные строки
- вместо нулей можно указать любые цифры и символы
Следующий пример прочитает содержимое файла testfile и дополнит каждую строку до 10 нулей:
cat testfile | while read -r line ; do echo "0000000000$line" | rev | cut -c 1-10 | rev; done
Чтобы увеличить количество символов, отредактируйте 0000000000 (впишите любое количество нулей, который больше длины, требуемой вам) и отредактируйте опцию программы cut: -c 1-10 (вместо 10 укажите нужное количество символов).
К примеру, теперь мне нужно увеличить строку до 40 символов, заполнив пробелы нулями:
cat testfile | while read -r line ; do echo "0000000000000000000000000000000000000000$line" | rev | cut -c 1-40 | rev; done
Или вместо нулей я хочу использовать, допустим, символ "A":
cat testfile | while read -r line ; do echo "AAAAAAAAAA$line" | rev | cut -c 1-10 | rev; done
Чуть отредактировав команду, можно использовать, допустим, символы табуляции:
cat testfile | while read -r line ; do echo -e "\t\t\t$line" | rev | cut -c 1-10 | rev; done
Обратите внимание, что к команде echo добавлена опция -e, а символы табуляции обозначаются как \t.
Вместо нулей также можно использовать пробелы:
cat testfile | while read -r line ; do echo " $line" | rev | cut -c 1-10 | rev; done
Связанные статьи:
- Как добавить строку в начало или в конец каждой строчки (86.6%)
- Как удалить newline (символ новой строки) из вывода команд и файлов в командной строке Linux (77.9%)
- Как сделать замену от совпадения до конца строки (77.6%)
- Как отфильтровать текст, находящийся между двумя определёнными строками (72.2%)
- Инструкция по использованию printf в Bash для форматирования и вывода данных (69.5%)
- Как ввести в cin строки с пробелами в С++ (RANDOM - 5.4%)