Сценарий Unix для обработки данных путем сравнения их с теми же ключевыми записями

Нашли рабочее решение в Заменить переменные среды в файле их фактическими значениями?

(..env && eval "echo \"$(cat config.xml)\"")

Изменить :Это решение также удаляет метки "в файлах. Это не то, что я хотел.

1
07.09.2021, 13:33
1 ответ

Поскольку дата вступления в силу предыдущей записи с тем же идентификатором считается датой окончания, вы можете сделать это с помощью стандартного sedи шаблона N;P;D, подобного этому:

sed '$!N;s/^\(.\{6\}\)\(.\)\(.\{10\}\)\(.*\n\1.\{11\}\).*/\1\2\3\4\3/;P;D'

Но как только вам нужно изменить дату, вам нужна утилита, которая понимает календарь наподобие GNUdate:

date -d "2021-09-08 yesterday" +"%Y-%m-%d"

выводит 2021-09-07. Я сомневаюсь, что многие версии dateбудут работать таким образом. Но с текущими GNU dateи GNU sedэто должно работать :

.
sed -nE 'G
  s/^(.{6})(.{11}).*\n\1.(.{10}).*/\1\2\3/p
  s/\n.*//p
  s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/e
  h' fileA > fileB

Попробую объяснить:

  • Мы используем параметр nдля подавления вывода по умолчанию и параметр Eдля расширенных регулярных выражений (только для удобства чтения)
  • Gдобавляет пробел, где мы собираемся сохранить предыдущую строку с адаптированной датой (см. ниже)
  • s/^(.{6})(.{11}).*\n\1.(.{10})/\1\2\3/pзаменяет дату текущей строки адаптированной датой из области хранения, только если она имеет тот же идентификатор (, поэтому обратная ссылка\1pудаляет ее
  • s/\n.*//pпросто удаляет добавленную строку, если замены не было, и pудаляет ее
  • s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/eиспользуйте флаг GNU sed's execute для отправки даты в утилиту dateдля ее уменьшения
  • hсохраняет эту измененную строку для хранения пробела
0
08.09.2021, 12:05

Теги

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