2013-05-30 52 views
2

我在bash 2腳本,我有一些文件:在一個月內改變從一個bash腳本調用一個星期

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 

它做貓的文件,在一個月內,但現在我需要調用腳本具有特異性IC本週一年:

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

+0

transaction-date.csv.bz2,其中日期可以是2012-01-02或某個日期 –

+0

所以你問:「shell如何將年份和星期數轉換爲其組成年份 - 月份日日期?」星期日或星期一開始幾周?是周編號00 .. 53還是01 .. 53(ISO)? – pilcrow

+1

您的原始腳本是否真的有用?有一個失蹤的「... – tink

回答

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爲所需的日期,你將通過您所有的文件,找到那些與你想要的日期範圍。 注意:一年中的一週是零填充。您可能需要零填充週數的輸入匹配。

+1

僅僅枚舉給定周的七個可能的文件名並挑選那些已存在的文件名是沒有多大意義的,而不是在可能的大目錄上運行'find'來挑選這七個文件(現在)可預測名字呢? – tripleee

+0

好的,我想在2012年的第31周。七個可能的日期是什麼?使用標準的Unix工具沒有簡單的方法來做到這一點。另外,如果你每天有一個文件,那麼你在10年內只談論3652個文件。我的筆記本電腦能夠在半秒鐘內使用'find'處理71,000。我沒有閱讀這些文件。我只是解析目錄信息。緩慢的部分將解壓並連接出文件。 –

+0

我原本以爲GNU'date'能夠解析'date -d「31周」'但是可惜,事實並非如此。我能夠證明,在2012年,第31周從第211天開始,但並不像我預想的那麼簡單。除非你有一個非常大的目錄,否則循環遍歷文件是最簡單的解決方案。 – tripleee

相關問題