Замените данные на определенный символ, затем измените значение после x строк

У меня есть текстовый файл, все значения 23-го символа равны 0 но мне нужно, чтобы они были значением X которое начинается с 1 и увеличивает каждые 58 строк, пока не достигнет конечного значения 64 .

Я попытался использовать этот код sed , но он не является специфичным и изменяет все значения 0 на 64 значения.

  • Как разбирать JSON с помощью сценариев оболочки в Linux?
  • Отфильтровать файл журнала по месяцам, дате и времени в bash
  • Как я могу автоматически перезапустить gnome-shell, выходящий из режима приостановки?
  • Использование awk для определения максимального значения в нескольких подмножествах данных внутри файла
  • обмен словами с awk вокруг символа / текста ("to")
  • Замените все буквы словом «*» после определенного слова в текстовом файле
  •  for i in $(seq 1 1 64); do sed -e "s/0/$i/g" file.txt > newfile.txt done 

    У меня есть;

     ATOM 1 C0 ODA 0 1.452 2.430 23.632 1.00 1.00 C ATOM 2 C1 ODA 0 1.839 1.672 22.372 1.00 1.00 C ... ATOM 3711 H56 ODA 0 30.750 32.945 0.998 1.00 1.00 H ATOM 3712 H57 ODA 0 31.934 32.195 0.165 1.00 1.00 H 

    И я хочу;

     ATOM 1 C0 ODA 1 1.452 2.430 23.632 1.00 1.00 C ATOM 2 C1 ODA 1 1.839 1.672 22.372 1.00 1.00 C ... ATOM 3711 H56 ODA 64 30.750 32.945 0.998 1.00 1.00 H ATOM 3712 H57 ODA 64 31.934 32.195 0.165 1.00 1.00 H 

    Я не женат на использовании sed это всего лишь ограничение моего знания bash. Я думаю, что awk может быть лучше, но я ничего не знаю об этом.

  • Sed, Awk Multiline log file, число {0-999] идентифицирует отношение
  • Как заменить строку в файлах, кроме строки, начинается с #
  • Как извлечь журналы между двумя отметками времени, строка может начинаться с даты и времени
  • Заменить первое появление шаблона в файле, который может содержать косую черту
  • сравнить файлы на основе двух столбцов и добавить поле
  • Как предотвратить предотвращение утечки sed?
  • 3 Solutions collect form web for “Замените данные на определенный символ, затем измените значение после x строк”

     perl -lpe 's/^.{22}\K0/$. % 58 ? $a||0 : $a++/e' yourfile 

    Коротко:

    Пропустите первые 22 символа и удерживайте их в стороне от появления в сопоставлении, потому что \K и 23-й символ наверняка равны 0 за ваш spec. Номер строки $. % 58 $. % 58 сообщит нам, нужно ли нам держать счетчик удерживаемым или увеличиваться.

    Если вам действительно нужно изменить позицию определенного символа в awk , вы можете установить пустой разделитель полей поля:

     awk 'BEGIN{FS=""; OFS=FS} {$23 = int(FNR / 58) + 1 ; print}' file 

    OTOH, если вы действительно хотите изменить пятое поле, разделенное пробелами, тогда вы можете просто использовать разделитель по умолчанию

     awk '{$5 = int(FNR / 58) + 1 ; print}' file 

    Чтобы заменить только 0 в 23-м столбце (или в данном примере 5-го столбца), вам нужно что-то вроде этого:

     sed -e "s/^\(\(\S\S*\s\s*\)\{4\}\)0 /\1$i/" file.txt > newfile.txt 

    Но это замечание только для того, чтобы улучшить ваши знания. Замена с добавочными переменными не является типичной работой sed. Это возможно, но не практично. Вы можете смешать sed со сценарием оболочки, но, возможно, вам лучше использовать язык скриптов по вашему выбору, например python или perl.

    Linux и Unix - лучшая ОС в мире.