在文件夹中存在的多个文件中动态地将日期部分替换为当前日期 -15 天

Replace a date part with current date -15 days dynamically in multiple files present in a folder

我完全是 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 = "*"
  }
   == "RTG" &&  == "TD8" {
    gsub(/[0-9]{8}/, NewDate, )
  }
  1' file

但我想将它应用于目录中的所有文件。

如果第四列只有日期,您可以用新日期替换每组 8 位数字:

awk -v "NewDate=$(date -d '-15 days' +'%Y%m%d')" '
  BEGIN {
    FS = OFS = "*"
  }
   == "RTG" &&  == "TD8" {
    gsub(/[0-9]{8}/, NewDate, )
  }
  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 = "*"
  }
   == "RTG" &&  == "TD8" {
    gsub(/[0-9]{8}/, NewDate, )
  }
  1' "$f" > .tmpfile && mv .tmpfile "$f"
done