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

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.

  • используя Sed для поиска и замены строки внутри файла
  • Каков правильный способ вставки \ u с помощью sed?
  • Дублирование каждой строки при изменении значения в каждой копии строки по-разному в Linux
  • добавить в файл добавочный столбец идентификатора
  • Linux + заменить STRING / WORD в файле согласно правилу
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Шаблон Regex для замены нескольких значений с помощью sed
  • Как получить «\» вместо «» после замены sed?
  • Как совместить классы символов POSIX регулярного выражения?
  • Соответствие пяти столбцов в двух файлах с использованием Awk
  • умножение каждой строки
  • Как я могу разобрать xml-файл с URL-адреса http без загрузки файла и распечатать нужную строку?
  • Linux и Unix - лучшая ОС в мире.