我对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
但是我想将其应用于目录中存在的所有文件。
答案 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