在AWK中使用和操作日期变量

时间:2016-03-04 21:52:09

标签: bash date 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天,但我想我在这里得到太多的单引号和双引号,而我的大脑正在失去...

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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]}"