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

时间:2019-05-02 17:26:36

标签: shell aix

我对UNIX完全是个新手。有人可以帮我一个要求,如果它是一个*(星号)分隔的文件,其中有多行以RTG开头,并且第3列= TD8,我想对日期部分进行子字符串化, 我要替换为currentdate减去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 :(得分:0)

如果第四列中只有日期,则可以用新日期替换每组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