我有一个.csv文件,其中包含日期以及是否愉快的答案:
2019-04-1,enjoyable
2019-04-2,unenjoyable
2019-04-3,unenjoyable
2019-04-4,enjoyable
2019-04-5,unenjoyable
2019-04-6,unenjoyable
2019-04-7,enjoyable
2019-04-8,unenjoyable
2019-04-9,unenjoyable
2019-04-10,enjoyable
2019-04-11,enjoyable
2019-04-12,enjoyable
2019-04-13,unenjoyable
2019-04-14,enjoyable
2019-04-15,unenjoyable
2019-04-16,unenjoyable
2019-04-17,unenjoyable
2019-04-18,enjoyable
2019-04-19,unenjoyable
2019-04-20,unenjoyable
2019-04-21,unenjoyable
2019-04-22,unenjoyable
2019-04-23,unenjoyable
2019-04-24,unenjoyable
2019-04-25,unenjoyable
2019-04-26,unenjoyable
我想做的是在第三栏中以“,”分隔打印星期几,如下所示:
2019-04-1,enjoyable,2
2019-04-2,unenjoyable,3
我尝试过:
dates=$(awk '{FS=","}{print $1,$2}' weather_stat.csv')
weeks=$(
for vars in $dates[first_row]
do
echo $(date -j -f '%Y-%m-%d' $vars "+%w")
done
)
merge($dates,$weeks)
代码的第一部分工作正常,但是在第二部分中,我对如何获取第一行中的数据感到困惑(因此,我使用dates [first_row]表示dates变量中的第一行)从变量“ dates”中获取,因此我们可以在其上应用“ date”方法
第三部分,我想将这两个表合并在一起。我找到了“ join”功能,但它似乎可以在两个文件而不是两个变量上工作(我不想在此过程中有任何新文件)
有人可以告诉我如何在变量中获取行而不是在shell中获取文件以及如何合并两个类似于表的变量的方法吗?
答案 0 :(得分:3)
使用GNU awk:
awk' BEGIN{FS=OFS=","}
{ split($1,a,"-")
t=sprintf("%0.4d %0.2d %0.2d 00 00 00",a[1],a[2],a[3]);
print $0,strftime("%w",mktime(t))
}' file.csv
答案 1 :(得分:3)
在学习shell脚本时,需要学习以下代码:
读取您的csv文件,并获取文件中每个日期的工作日编号:
while IFS=, read -r date rest; do echo "$date,$(date -d "$date" +%w)"; done < file.csv
将该命令的输出与您的文件连接:
weekdays=$(while IFS=, read -r date rest; do echo "$date,$(date -d "$date" +%w)"; done < file.csv)
join -t, file.csv <(echo "$weekdays")
或者,无需将结果存储在中间变量中
join -t, file.csv <(
while IFS=, read -r date rest; do echo "$date,$(date -d "$date" +%w)"; done < file.csv
)
<()
中的换行不是必需的,但是对于可维护的代码很有用。
但是,您会发现这样做效率较低,因为您必须两次处理文件。使用awk,您只需阅读一次文件即可。
答案 2 :(得分:1)
仅使用Bourne shell,如果CSV文件中包含很多行,则效率低于awk:
while IFS=, read date enjoy; do
date -d "$date" +"$date,$enjoy,%w"
done < your.csv