Заменить часть даты на текущую дату -15 дней динамически в нескольких файлах, присутствующих в папке - PullRequest
0 голосов
/ 02 мая 2019

Я совершенно новичок в Unix. Может ли кто-нибудь помочь мне с требованием, где файл с разделителями * (звездочкой) состоит из нескольких строк, начинается с RTG и 3-го столбца = TD8 Я хочу вставить часть даты и Я хочу заменить текущую дату минус 15 дней. Вот пример. я использую сервер AIX

$ cat temp.txt  
RTG*888*TD8*20180201~  
TWW*888*RD8*20180301-20180301~  
RTG*888*TD8*20180401-20180501~  
KCG*888*TD8*20180101-20180201~

Я хочу вывод, как показано ниже, путем изменения даты. Пожалуйста помоги. Я ищу сценарий UNIX, чтобы он работал для всех файлов в этом каталоге

RTG*888*TD8*20190417~   
TWW*888*RD8*20180201-20180201~  
RTG*888*TD8*20190417-20190417~  
KCG*888*TD8*20180201-20180201~

Это работает для одного файла:

awk -v "NewDate=$(TZ=GMT+100 date +%Y%m%d)" '
  BEGIN {
    FS = OFS = "*"
  }
  $1 == "RTG" && $3 == "TD8" {
    gsub(/[0-9]{8}/, NewDate, $4)
  }
  1' file

но я хочу применить его ко всем файлам, присутствующим в каталоге.

1 Ответ

0 голосов
/ 03 мая 2019

Если в четвертом столбце есть только даты, вы можете заменить каждую группу из 8 цифр новой датой:

awk -v "NewDate=$(date -d '-15 days' +'%Y%m%d')" '
  BEGIN {
    FS = OFS = "*"
  }
  $1 == "RTG" && $3 == "TD8" {
    gsub(/[0-9]{8}/, NewDate, $4)
  }
  1' file

Учитывая ваш пример, его вывод выглядит следующим образом:

RTG*888*TD8*20190418~
TWW*888*RD8*20180301-20180301~
RTG*888*TD8*20190418-20190418~
KCG*888*TD8*20180101-20180201~

Чтобы применить его ко всем файлам в каталоге, используйте цикл for и временные файлы:

for f in directory/*; do
  awk -v "NewDate=$(date -d '-15 days' +'%Y%m%d')" '
  BEGIN {
    FS = OFS = "*"
  }
  $1 == "RTG" && $3 == "TD8" {
    gsub(/[0-9]{8}/, NewDate, $4)
  }
  1' "$f" > .tmpfile && mv .tmpfile "$f"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...