Добавление номера в текстовый файл с помощью цикла

У меня есть текстовый текстовый файл типа «день-месяц»:

day =

8
9
10
15
1

month =

3
6
7
10
1

Мне нужно добавьте «0» в строки, включая только одноразрядные числа. Мне нужно написать цикл, чтобы найти одноразрядное число во всех строках и добавить «0» слева от числа, например:

day =

03
06
07
10
01

month =

03
06
07
10
01
1
задан 21 October 2015 в 20:37

4 ответа

[F1]
5
ответ дан 23 May 2018 в 16:31
  • 1
    Мне действительно нравится это решение. 1. Он использует xargs, который часто забывается. 2. Использует возможность printf форматировать несколько аргументов с использованием одного выражения форматирования. 3. printf позволяет принимать несколько входных форматов чисел, например, шестнадцатеричный 0x1a. 4. printf проверяет ввод как число и разумно сообщает о проблемах stderr. – pabouk 22 October 2015 в 15:08
  • 2
    Я заметил только один значительный недостаток: несколько значений в одной строке приведут к появлению нескольких строк на выходе. Попробуйте: echo 1 2 3 | xargs printf "%.2d\n". Это можно как-то разрешить, используя -d\\n totption to xargs. – pabouk 22 October 2015 в 15:08

Perl one-liner approach, подходящий, поскольку, вероятно, каждая оболочка имеет предустановленную perl:

perl -ne 'printf("%02d\n",$_)'<numbers.txt > numbers_out.txt
4
ответ дан 23 May 2018 в 16:31
  • 1
    ура ! Но из-за плохой репутации пользовался " Perl в эти дни, я лично всегда предоставляю своеобразное учебное пособие по месту хотя бы для опций и синтаксиса регулярных выражений. Просто предложение (+1 в любом случае). – Cbhihe 21 October 2015 в 20:56
  • 2
    У Perl есть плохая репутация, потому что есть много программистов на Java, которые любят синтаксис «java style», и они не получают синтаксис стиля C perl. Это не значит, что они правы. (Все аргументы против perl применяются к sed / awk, но они все еще довольно популярны. И вы можете писать хороший код в perl). – Sobrique 21 October 2015 в 21:39
  • 3
    @Cbhihe Это довольно распространенный механизм (printf), доступный во многих языках программирования / unix, а также перенаправление потоков / файлов является общим механизмом Unix. О perl -ne: stackoverflow.com/questions/2212378/… – mrarm 6 November 2015 в 11:43

Использование sed - инструмент, подходящий для задач в виде пакетного или потокового редактирования текстовых файлов или потоков.

в качестве фильтра, который будет использоваться в трубе: sed 's/^[0-9]$/0&/' в качестве команды для редактирования файла : sed -i 's/^[0-9]$/0&/' numfile.txt

Код добавит 0 к строкам, содержащим только одну цифру 0 - 9. Вместо [0-9] вы также можете использовать [[:digit:]].

3
ответ дан 23 May 2018 в 16:31
  • 1
    - более общее и бережливое решение, чем предлагаемое @heemayl, не говоря уже о том, что предпочтительнее цикл while, imo. Kudos (+1) – Cbhihe 21 October 2015 в 21:06

awk. Перенаправление вывода обратно в файл с созданием tmp.txt и заменой исходного файла на tmp.txt после выполнения команды.

Команда

awk '/^[[:digit:]]$/ {$1="0"$1}1'  numFile.txt  > tmp.txt && mv tmp.txt numFile.txt

Пример вывода

xieerqi:$ cat numFile.txt                                                      
1
2
3
4
5
6
7
8
9
10
11
12

xieerqi:$ awk '/^[[:digit:]]$/ {$1="0"$1}1'  numFile.txt  > tmp.txt && mv tmp.txt numFile.txt 

xieerqi:$ cat numFile.txt                                                      
01
02
03
04
05
06
07
08
09
10
11
12
0
ответ дан 23 May 2018 в 16:31

Другие вопросы по тегам:

Похожие вопросы: