Слияние файлов по датам - PullRequest
       5

Слияние файлов по датам

1 голос
/ 13 февраля 2020

В сценарии bash я пытаюсь объединить файлы еженедельных данных в файл финансового года, где финансовый год начинается в июне каждого года и заканчивается в мае каждого года. К еженедельным файлам добавляются даты выходных в формате ГГГГММДД. Я пытаюсь собрать логи c, которые создают файлы FY.

Еженедельные файлы:

  • blahblahblah_20191207.txt
  • blahblahblah_20191214 .txt
  • blahblahblah_20191221.txt

FY Файлы:

  • FY2019.txt содержит данные с июня 2018 года по май 2019
  • FY2020.txt включает данные с июня 2019 года по май 2020 года

Исключение:

  • blahblahblah_20190630.txt может содержать данные за несколько дней относящиеся к FY19 и FY10

Вопрос: Как мне соединить логи c в сценарии bash для этого? Я пробовал это, но, похоже, не работает ...

newfymonth="06"
fiscal_file="Not_Defined"
current_year=`(date +"%Y")`
currentyearminusone=`echo "$(($current_year - 1))"`
currentyearplusone=`echo "$(($current_year + 1))"`
if [ "$filemonth" -ge "$newfymonth" ] && [ "$fileyear" -eq "$current_year" ]; then
            fyfileyear=`echo "$(($fileyear + 1))"` 
            fiscal_file="FY"$fileyear".txt"
        elif [ "$filemonth" -lt "$newfymonth" ] && [ "$fileyear" -eq "$current_year" ]; then
            fyfileyear=`echo "$(($fileyear))"` 
            fiscal_file="FY"$fileyear".txt"
        elif [ "$filemonth" -ge "$newfymonth" ] && [ "$fileyear" -eq "$currentyearminusone" ]; then
            fyfileyear=`echo "$(($fileyear + 1))"`
            fiscal_file="FY"$fileyear".txt" 
        elif [ "$filemonth" -lt "$newfymonth" ] && [ "$fileyear" -eq "$currentyearplusone" ]; then
            fyfileyear=`echo "$(($fileyear))"` 
            fiscal_file="FY"$fileyear".txt" 
fi

Дополнительная информация: Структура файла

Март = март. Первые 3 буквы месяца. Данные примерно такие ...

"ASAP","Castaway","Broadway","Ju1-9-2019","Recyle","NYNY","Pausing","Material","Nature",,55.5640,,0.3350,-10.9250,1.7450,,,,,,,1.3500,,,3.1750,21.5000
"ASAP","Castaway","Broadway","Aug-9-2019","Recyle","NYNY","Pausing","Material","Nature",,55.5640,,0.3350,-10.9250,1.7450,,,,,,,1.3500,,,3.1750,21.5000 
"ASAP","Castaway","Broadway","Sep-9-2019","Recyle","NYNY","Pausing","Material","Nature",,55.5640,,0.3350,-10.9250,1.7450,,,,,,,1.3500,,,3.1750,21.5000 

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Предполагается:

  • Значения полей не включают запятые (по крайней мере, первые три поля до поля даты).
  • День месяца представлен в виде «6», а не «06», если число меньше 10.
  • Название месяца представлено в верхнем верблюжьем регистре из трех символов.

Тогда как насчет :

declare -A m2n=([Jan]=1 [Feb]=2 [Mar]=3 [Apr]=4 [May]=5 [Jun]=6
        [Jul]=7 [Aug]=8 [Sep]=9 [Oct]=10 [Nov]=11 [Dec]=12)
                                                        # table of month name
for f in *.txt; do
    [[ $f =~ .*[[:digit:]]{8]\.txt ]] || continue       # skip other files
    while IFS= read -r line; do
        IFS="," read j0 j1 j2 date j3 <<< "$line"       # extract the date field
        IFS="-" read m d y <<< "${date//\"/}"           # split into mon, day, year
        fy=$y                                           # fiscal year
        mn=${m2n[$m]}                                   # monname to number
        (( mn >= 6)) && (( fy++ ))                      # adjust fiscal year
        printf "%04d,%04d%02d%02d,%s\n" "$fy" "$y" "$mn" "$d" "$line"
                                                        # prepend fiscal year and canonicalized date for sorting and determining the output fi
le
    done < "$f"
done | sort | while IFS="," read -r fy date rest; do
    file="FY${fy}.txt"                                  # output filename
    echo "$rest" >> "$file"
done
  • Сначала объединяются все строки в соответствии с рекомендациями KamilCuk.
  • При объединении строк перед строкой добавляется финансовый год и канонизированная дата для сортировки. строки позже.
  • В следующем while l oop он определяет имя файла назначения.
0 голосов
/ 13 февраля 2020

Я имею в виду, что это можно решить на основе того, как вы форматируете свой файл ... например, если это что-то вроде YYMMDD-log.txt, вы можете просто проверить каждый файл, который просто проверяет дату, если совпадает с датой текущего журнала, тогда добавить данные к последнему.

...