change the call from a bash script in a month to a

2019-04-14 20:18发布

问题:

I have 2 script in bash, and i have some files:

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

I have a script called script.sh

cat script.sh

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

And if you need call the script you can use other script

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

And it do cat the files in a month, but now i need call the script with a specific week in a year:

bash script2.sh 2012-01

where 2012 is the year and 01 is the month

Now i need call the script with:

bash script2.sh 2012 13

where 2012 is the year and 13 is the week in a year

Now i need the cat only to the files in the year and week that the user specified, no per month per week

But the format of the files do not help me!!!! because the name is transaction-year-month-day.csv.bz2, not transaction-year-week.csv.bz2

回答1:

Take a look at the manpage for strftime. These are date format codes. For example:

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

Will print out a date like:

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

Try to see why this works.

On some systems, the date command will have a -j switch. This means, don't set the date, but reformat the given date. This allows you to convert one date to another:

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

The $input_format is the format of your input date. $string_date is the string representation of the date in your $input_format. And, $output_format is the format you want your date in.

The first two fields are easy. Your date is in YY-MM-DD format:

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

The question is what can you do for the final format. Fortunately, there is a format for the week in the year. %V which represents the weeks at 01-53 and %W which represents the weeks as 00-53.

What you need to do is find the date string on your file name, then convert that to the year and week number. If that's the same as the input, you need to concatenate this file.

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

For example, someone puts in 2013 05 as the desired date, you will go through all of your files and find ones with dates in the range you want. NOTE: That the week of the year is zero filled. You may need to zero fill the input of the week number to match.



标签: linux bash shell