Linux 将一个月内的bash脚本调用更改为一周

Linux 将一个月内的bash脚本调用更改为一周,linux,bash,shell,Linux,Bash,Shell,我在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

我在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
它会在一个月内对文件进行cat,但现在我需要在一年中的一周内调用脚本:

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,所以请查看手册页以了解更多信息。这些是日期格式代码。例如:

$ 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\u格式是输入日期的格式
$string\u date
是日期的字符串表示形式,格式为
$input\u
。而且,
$output\u 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
作为所需日期,您将浏览所有文件,找到日期在所需范围内的文件注意:一年中的一周是零填充的。您可能需要将周数的输入归零以匹配。

transaction-date.csv.bz2,其中日期可以是2012-01-02或某个日期,因此您会问,“在shell中如何将年和周数转换为其组成的年-月-日日期?”周是从周日还是周一开始?周数是00。。53或01。。53(ISO)?您的原始脚本实际有效吗?缺少“…是的,我需要知道一周的日期,例如,第45周开始于2013-11-04,结束于2013-11-10我需要日期的范围您的脚本包含几个语法错误(
)。如果只列举一周内可能存在的七个文件名,并选择其中存在的文件名,而不是在一个潜在的大目录上运行
find
,只选择这七个(现在)具有可预测名称的文件,这不是更有意义吗?好的,我想要2012年的第31周。七个可能的日期是什么?使用标准的Unix实用程序没有简单的方法可以做到这一点。此外,如果你每天有一个文件,那么10年内你只需要3652个文件。我的笔记本电脑能够在半秒内使用
find
处理71000个数据。我不是在看文件。我只是在解析目录信息。缓慢的部分将是解压和连接文件。我曾期望GNU
date
能够解析
date-d“第31周”
,但遗憾的是,它没有。2012年,第31周从第211天开始,但这并不像我想象的那么简单。除非您有一个非常大的目录,否则循环文件毕竟是一个简单的解决方案。值得一提的是,
coreutils
版本的
date
没有
-j
选项,而
-f
选项具有完全不同的含义
date-d“$file\u date”+%Y%W”
如果要将脚本转换为使用GNU
date
,则应该可以使用。这最终会成为BSDism on date。我认为GNU/Linux也有类似的机制。OP没有以这样或那样的方式对此发表评论。如果这不起作用,他们将不得不切换到脚本语言,如Perl、Python或Ruby。