2016-03-04 35 views
1

我認爲可能有更好的方法來做到這一點,但我唯一想到的就是使用AWK。在AWK中使用和操作日期變量

我有名字約定文件中像下面:

testfile_2016_03_01.txt

使用一個命令我想以一天來接班testfile_20160229.txt

我從開始使用:

file=testfile_2016_03_01.txt 
IFS="_" 
arr=($file) 
datepart=$(echo ${arr[1]}-${arr[2]}-${arr[3]} | sed 's/.txt//') 
date -d "$datepart - 1 days" +%Y%m%d 

上述工作正常,但我真的想在AWK中做到這一點。我發現的唯一的東西是如何使用AWK內的「日期」

new_name=$(echo ${file##.*} | awk -F'_' ' { 
"date '+%Y%m%d'" | getline date; 
print date 
}') 
echo $new_name 

沒關係,所以兩件事情發生在這裏。出於某種原因,$4還含有.txt即使我刪除它(?)​​

和主要的問題是我不知道如何將變量傳遞給該日期,下面不工作

`awk -F'_' '{"date '-d "2016-01-01"' '+%Y%m%d'" | getline date; print date}') 

最好我想2016-01-01是從文件名$2-$3-$4和。減去1天未來變數,但是我想我在這裏得到了太多的單,雙引號和我的大腦失去..

+1

從最終刪除:'$'而不是'{文件%%。*} ##'(或者只是一個''',因爲反正只有一個'.')。 –

+1

你有沒有或可以獲得GNU awk? –

+0

感謝BenjaminW,它的工作原理(雖然我不知道爲什麼##沒有,我確實有不同的腳本)。 @EdMorton我有gawk yes – Moseleyi

回答

2

等效awk命令:

file='testfile_2016_03_01.txt' 
echo "${file%.*}" | 
awk -F_ '{cmd="date -d \"" $2"-"$3"-"$4 " -1 days\"" " +%Y%m%d"; 
      cmd | getline date; close(cmd); print date}' 

20160229 
+1

作爲魅力工作。謝謝 – Moseleyi

1

與GNU awk的時間功能:

$ file=testfile_2016_03_01.txt 
$ awk -v file="$file" 'BEGIN{ split(file,d,/[_.]/); print strftime(d[1]"_%Y%m%d."d[5],mktime(d[2]" "d[3]" "d[4]" 12 00 00")-(24*60*60)) }' 
testfile_20160229.txt 
0

這可能會爲你工作:

file='testfile_2016_03_01.txt' 
IFS='_.' read -ra a <<< "$file" 
date -d "${a[1]}${a[2]}${a[3]} -1 day" "+${a[0]}_%Y%m%d.${a[4]}"