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

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

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

 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 может быть лучше, но я ничего не знаю об этом.

  • Любой способ, с помощью которого я могу преобразовать любую заданную временную метку в стандартную в BASH
  • Многострочный grep был связан с двумя тегами, отображать только последнее совпадение
  • с sed, как я могу заменить слово в соответствующей строке?
  • читать значения столбца из файла и печатать один за другим
  • заменить строку в цикле
  • Объединение двух CSV по сравнению только с определенным столбцом
  • Удалить неизвестный символ юникода из textfiles - sed, другие методы bash / shell
  • Удалить перенос с помощью 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 - лучшая ОС в мире.