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

Я пытаюсь работать над сценарием, в котором файл с разделителями * (звездочкой) состоит из нескольких строк, начинается с 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~

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Следующее будет работать в системах с утилитой даты Bash и GNU.Давайте сделаем простой скрипт, используя цикл «пока читаем»:

# 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
0 голосов
/ 24 апреля 2019

Учитывая, что ваши файлы не будут иметь будущих дат (согласно вашим образцам выглядит так), если это так, попробуйте.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...