我有一个.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"获取第一行中的数据感到困惑(所以我使用 dates[first_row] 来表示日期变量中的第一行(,因此我们可以对其应用"date"方法
对于第三部分,我想将这两个表合并在一起。我找到了"join"功能,但它似乎适用于两个文件而不是两个变量(我不想在此过程中有任何新文件(
谁能告诉我如何在变量中获取行而不是 shell 中的文件以及合并两个类似表的变量的方法?
在学习 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,您只需通读一次文件。
使用 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
只有你的 Bourne shell,所以如果你的 CSV 文件中有很多行,效率低于 awk:
while IFS=, read date enjoy; do
date -d "$date" +"$date,$enjoy,%w"
done < your.csv