2

我在 bash 中有 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

它确实会在一个月内收集文件,但现在我需要在一年中的特定周调用脚本:

bash script2.sh 2012-01

其中 2012 是年份,01 是月份

现在我需要调用脚本:

bash script2.sh 2012 13

其中 2012 是年份,13 是一年中的第几周

现在我只需要 cat 到用户指定的年份和周内的文件,而不是每周每月

但是文件的格式对我没有帮助!!!!因为名称是 transaction-year-month-day.csv.bz2,而不是 transaction-year-week.csv.bz2

4

1 回答 1

0

查看strftime的联机帮助页。这些是日期格式代码。例如:

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

将打印出如下日期:

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

试着看看为什么会这样。

某些系统上,该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了所需的日期,您将浏览所有文件并找到日期在您想要的范围内的文件。注意:一年中的一周是零填充的。您可能需要将输入的周数填零以匹配。

于 2013-05-30T19:04:48.083 回答