这是一个包含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
答案 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