我在 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 是一年中的第几周
现在我只需要猫到用户指定的年和周内的文件,而不是每月每周
但是文件的格式对我没有帮助!!!!因为名字是transaction-year-month-day.csv.bz2,不是transaction-year-week.csv.bz2
最佳答案
查看 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
作为所需的日期,您将遍历所有文件并找到日期在您想要的范围内的文件。 注意:一年中的第几周用零填充。您可能需要将输入的周数填零以匹配。
关于linux - 在一个月内将调用从 bash 脚本更改为一周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842168/