我正在尝试处理一个脚本,该脚本是一个*(星号)定界文件,其中有多行以DTP开头。我想对日期部分进行细分,并与今天的日期进行比较。如果它比今天大,我要替换为今天的日期。这是一个例子。
$ cat temp.txt
RTG*888*TD8*20180201-20180201~
TWW*888*RD8*20180201-20180201~
RTG*888*TD8*20180201-20180201~
KCG*888*TD8*20180201-20180201~
我希望通过更改日期输出如下。请帮忙。我正在寻找UNIX脚本来使其适用于该目录中存在的所有文件
RTG*888*TD8*20190424-20190424~
TWW*888*RD8*20180201-20180201~
RTG*888*TD8*20190424-20190424~
KCG*888*TD8*20180201-20180201~
预先感谢
答案 0 :(得分:0)
考虑到您的文件将没有未来的日期(按照您的示例显示),如果是这种情况,请尝试。
awk -v dat="$(date +%Y%m%d)" '
BEGIN{
FS=OFS="*"
}
{
split($4,array,"[-~]")
if(array[1]!=dat){
array[1]=dat
}
if(array[2]!=dat){
array[2]=dat
}
$4=array[1]"-"array[2]"~"
}
1' Input_file
答案 1 :(得分:0)
以下内容将在具有Bash和GNU的date实用程序的系统上工作。让我们使用“ while read”循环来做一个简单的脚本:
# read the file line by line with fields separated by *
while IFS='*' read -r str1 num str2 date; do
# if the first field is RTG
if [ "$str1" = "RTG" ]; then
# then substitute date with current date string
curdate=$(date +%Y%m%d)
date="${curdate}-${curdate}~"
fi
# print the output
printf "%s*%s*%s*%s\n" "$str1" "$num" "$str2" "$date"
# in while read loops - the input file is
# redirected to standard input on the end
done < file.txt
请您修改提供的脚本以用于目录中的所有文件。那对我很有帮助。
# for all entries in current directory (uses bash globulation settings(!))
for file in *; do
# check if it's a file
if [ ! -f "$file" ]; then
# if not, next entry
continue;
fi
# run the script
while IFS='*' read -r str1 num str2 date; do
if [ "$str1" = "RTG" ]; then
curdate=$(date +%Y%m%d)
date="${curdate}-${curdate}~"
fi
printf "%s*%s*%s*%s\n" "$str1" "$num" "$str2" "$date"
done < "$file"
done