2013-05-30 2 views
2

У меня есть 2 сценария в Баш, и у меня есть некоторые файлы:изменить вызов от Баш скрипт в месяц на неделю

transaction-2012-01-01.csv.bz2 
transaction-2012-01-02.csv.bz2 
transaction-2012-01-03.csv.bz2 
transaction-2012-01-04.csv.bz2 
      . 
      . 
transaction-2012-01-31.csv.bz2 
transaction-2012-02-01.csv.bz2 
      . 
      . 
transaction-2012-02-28.csv.bz2 

У меня есть сценарий под названием script.sh

cat script.sh 

YEAR_MONTH=$1 
FILEPATH="transaction-$YEAR_MONTH*.csv.bz2" 
bzcat $FILEPATH|strings|grep -v "code" >> output 

а если вам нужно вызвать скрипт, который вы можете использовать другой сценарий

cat script2.sh 

LAST_MONTH=$(date -d -1month +%Y"-"%m) 
if [ $# -eq 1 ]; then 
    DATE=$1 
else 
    DATE=$LAST_MONTH 
fi 

script.sh $DATE 1>output$DATE.csv 2>> log.txt 

И это сделать кошке файлы в месяц, но теперь мне нужно вызвать скрипт с specif IC неделю в течение года:

bash script2.sh 2012-01 

где 2012 год и 01 месяц

Теперь мне нужно вызвать скрипт с:

bash script2.sh 2012 13 

где 2012 год и 13 неделя в году

Теперь мне нужен кот только к файлам в году и неделю, указанным пользователем, нет в месяц в неделю

Но формат файлов мне не помогает !!!! потому что имя is transaction-year-month-day.csv.bz2, а не transaction-year-week.csv.bz2

+0

transaction-date.csv.bz2, где дата может быть 2012-01-02 или некоторая дата –

+0

Итак, вы спрашиваете: «Как в оболочке я конвертирую год и номер недели в свой составной год-месяц-день даты?» Неделя начинается в воскресенье или в понедельник? Пронумерованы ли недели 00 .. 53 или 01 .. 53 (ISO)? – pilcrow

+1

Действительно ли работает ваш оригинальный скрипт? Там отсутствует "... – tink

ответ

0

Посмотрите man-страницу для strftime. Это коды формата даты. Например:

$ date +"%A, %B %e, %Y at %I:%m:%S %p" 

напечатает дату, как:

Thursday, May 30, 2013 at 02:05:31 PM 

Try, чтобы понять, почему это работает.

На некоторые системы, команда date будет иметь -j переключатель. Это означает, что не устанавливайте дату, а переформатируйте данную дату. Это позволяет преобразовать одну дату в другую:

$ date -f"$input_format" "$string_date" +"$output_format" 

$input_format формат вашей даты ввода. $string_date - это строковое представление даты в вашем $input_format. И, $output_format - это формат, в котором вы хотите указать свою дату.

Первые два поля просты. Ваша дата в формате YY-MM-DD:

$ date -f"%Y-%m-%d" "$my_date_string" 

Вопрос заключается в том, что вы можете сделать для окончательного формата. К счастью, есть формат для недели в году. %V, который представляет недели в 01-53 и %W, что представляет недели как 00-53.

Что вам нужно сделать, это найти строку даты в имени файла, а затем преобразовать ее в число год и номер недели. Если это то же самое, что и вход, вам необходимо объединить этот файл.

find $dir -type f | while read transaction_file 
do 
    file_date=${transaction_file#transaction-} #Removes the prefix 
    file_date=${file_date%.csv.bz2}    #Removes the suffix 
    weekdate=$(date -j -f"%Y-%m-%d" "$file_date" +"%Y %W") 
    [ "$weekdate" -eq "$desired_date" ] || continue 
    ... 
done 

Например, кто-то ставит в 2013 05 в качестве желаемой даты, вы пройдете через все ваши файлы и найти те, с датами в диапазоне вы хотите. ПРИМЕЧАНИЕ: То, что неделя года равна нулю. Возможно, вам понадобится нулевой заполнять ввод номера недели для соответствия.

+1

Не имеет смысла просто перечислять семь возможных имен файлов за данную неделю и выбирать те, которые существуют, а не запускать 'find' в потенциально большой каталог, чтобы выбрать эти семь файлов с (теперь) предсказуемыми имена? – tripleee

+0

Хорошо, я хочу 31-ю неделю в 2012 году. Каковы семь возможных дат? Нет простого способа сделать это, используя стандартные утилиты Unix. Кроме того, если у вас есть один файл в день, вы говорите только о 3652 файлах за 10 лет. Мой ноутбук смог обработать 71 000 за полсекунды, используя 'find'. Я не читаю файлы. Я просто разбираю информацию каталога. Медленная часть будет разжимать и конкатенировать файлы. –

+0

Я ожидал, что GNU 'date' сможет проанализировать« date -d »неделю 31», но, увы, этого не происходит. Я смог установить, что в 2012 году неделя 31 началась 21-го дня, но это было не так просто, как я предполагал. Если у вас нет очень большой директории, цикл по файлам является простым решением в конце концов. – tripleee

Смежные вопросы