Как я могу добавить последовательность без использования awk для любого входного файла? - PullRequest
0 голосов
/ 24 апреля 2018

Предположим, у меня есть следующие данные в имени файла Details.txt:

0154 Raghav Sharma 26 Indore 
0159 rakh   patid  24 Pune
0159 rakh   patid  24 Pune
0018 sai    kanak  28 mumbai
0159 rakh   patid     Pune
0159 sarak  jatid     Pune

Теперь я применил следующую команду awk для генерации последовательности из 4 цифр №:

awk 'BEGIN{a=1;OFS="    "}/^/{$1=sprintf("%04d",a);++a;print $0; next;}{print $0}' Details.txt

output:

0001 0154 Raghav Sharma 26 Indore 
0002 0159 rakh   patid  24 Pune
0003 0159 rakh   patid  24 Pune
0004 0018 sai    kanak  28 mumbai
0005 0159 rakh   patid Pune
0006 0159 sarak  jatid Pune

форматирование последних двух строк нарушено. Пожалуйста, предложите способ, чтобы правильное форматирование и правильная последовательность не могли быть сохранены.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Вы хотите избежать пересчета $ 0; если вы это сделаете, несколько пробелов будут сжаты в один пробел:

$ cat Details.txt
0154 Raghav Sharma 26 Indore
0159 rakh   patid  24 Pune
0159 rakh   patid  24 Pune
0018 sai    kanak  28 mumbai
0159 rakh   patid     Pune
0159 sarak  jatid     Pune

$ gawk '{printf "%04d %s\n", NR, $0}' Details.txt
0001 0154 Raghav Sharma 26 Indore
0002 0159 rakh   patid  24 Pune
0003 0159 rakh   patid  24 Pune
0004 0018 sai    kanak  28 mumbai
0005 0159 rakh   patid     Pune
0006 0159 sarak  jatid     Pune
0 голосов
/ 24 апреля 2018
$ # nl command is more apt for numbering files
$ nl -s' ' --number-format=rz -w4 ip.txt
0001 0154 Raghav Sharma 26 Indore 
0002 0159 rakh   patid  24 Pune
0003 0159 rakh   patid  24 Pune
0004 0018 sai    kanak  28 mumbai
0005 0159 rakh   patid     Pune
0006 0159 sarak  jatid     Pune

$ # with awk, leaving this as an alternate to printf solution 
$ awk '{sub(/^/, sprintf("%04d ",++c))} 1' ip.txt
0001 0154 Raghav Sharma 26 Indore 
0002 0159 rakh   patid  24 Pune
0003 0159 rakh   patid  24 Pune
0004 0018 sai    kanak  28 mumbai
0005 0159 rakh   patid     Pune
0006 0159 sarak  jatid     Pune
  • с использованием sub здесь для вставки текста в начале строки
  • sprintf("%04d ",++c)) по умолчанию, неинициализированные переменные будут 0 в числовом контексте (или просто используйте NR, как показано в другом ответе)
  • 1 идиоматический способ печати содержимого $0
...