使用“日期”命令转换整个列

时间:2019-11-12 18:51:02

标签: linux bash date awk sed

这是一个包含3行的虚拟CSV文件。实际文件有700万行。

testdates.csv

y_m_d
1997-01-01
1985-06-09
1943-07-14

date工具通常可以这样格式化,以获取“ day”:

date -d "25 JUN 2011" +%A

=>输出:Saturday

查询:如何提供整列作为date +%A转换的输入?

结果输出应附加到输入文件的末尾。

预期输出:

y_m_d, Day
1997-01-01, Thursday
1985-06-09, Sunday
1943-07-14, Tuesday

3 个答案:

答案 0 :(得分:6)

要使用GNU日期从文件中读取多个日期,可以使用-f / --file选项:

$ date -f testdates.csv '+%F, %A'
1997-01-01, Wednesday
1985-06-09, Sunday
1943-07-14, Wednesday

由于您的文件具有标题行,因此我们必须跳过该行,例如使用进程替换和sed:

date -f <(sed '1d' testdates.csv) '+%F, %A'

要获得所需的输出,请像这样组合:

echo 'y_m_d, Day'
date -f <(sed '1d' testdates.csv) '+%F, %A'

或写入新文件:

{
    echo 'y_m_d, Day'
    date -f <(sed '1d' testdates.csv) '+%F, %A'
} > testdates.csv.tmp

,检查后,您可以使用

重命名
mv testdates.csv.tmp testdates.csv

答案 1 :(得分:4)

很难击败that date answer

GNU awk也可以:

gawk -v OFS=', ' '
    NR == 1 {$2 = "Day"}
    NR >  1 {$2 = strftime("%A", mktime(gensub(/-/, " ", "g", $1) " 0 0 0"))}
    1
' testdates.csv
y_m_d, Day
1997-01-01, Wednesday
1985-06-09, Sunday
1943-07-14, Wednesday

或perl:

perl -MTime::Piece -lne '
    print "$_, ", $. == 1
                    ? "Day"
                    : Time::Piece->strptime($_, "%Y-%m-%d")->strftime("%A")
' testdates.csv

答案 2 :(得分:2)

#/bin/bash

while read datespec; do
  echo $datespec, $(date -d "$datespec" +%A)
done < testdates.csv

输出:

1997-01-01, Wednesday
1985-06-09, Sunday
1943-07-14, Wednesday