使用awk分析csv文件-结合awk中的shell“date”命令

使用awk分析csv文件-结合awk中的shell“date”命令,shell,awk,Shell,Awk,我有一个.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-1

我有一个.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中的第一行,以便我们可以对其应用“date”方法

对于第三部分,我想把这两个表合并在一起。我找到了“join”函数,但它似乎可以处理两个文件,而不是两个变量。在此过程中,我不希望有任何新文件

谁能告诉我如何在shell中获取变量中的行而不是文件,以及如何合并两个类似于表的变量?

使用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
使用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

在学习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
)

中的新行当您学习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
)

如果CSV文件中有很多行,则中的换行符仅与Bourne shell一起使用,因此效率低于awk:

while IFS=, read date enjoy; do
    date -d "$date" +"$date,$enjoy,%w"
done < your.csv

仅使用Bourne shell,如果CSV文件中有大量行,则效率低于awk:

while IFS=, read date enjoy; do
    date -d "$date" +"$date,$enjoy,%w"
done < your.csv

谢谢,但是有没有在变量而不是文件中应用shell方法呢?比如加入$var1$var2@YilingLiu我不明白你的问题。您有一个CSV文件,并且需要此输出。为什么要使用shell变量?此外,join命令也适用于文件,因此$var1和$var2必须是文件,而且时间格式是第一位的:我是一名新的shell学习者,以前使用过python。我认为对于meNot来说,使用变量来存储上一个命令的结果更容易理解:awk'BEGIN{print mktime2019 04 26 01 02 03;print mktime2019 4 26 1 2 3}谢谢,但是在变量中应用shell方法而不是在文件中应用shell方法吗?比如加入$var1$var2@YilingLiu我不明白你的问题。您有一个CSV文件,并且需要此输出。为什么要使用shell变量?此外,join命令也适用于文件,因此$var1和$var2必须是文件,而且时间格式是第一位的:我是一名新的shell学习者,以前使用过python。我认为使用变量来存储上一个命令的结果对于meNot来说更容易理解,因此:awk'BEGIN{print mktime2019 04 26 01 02 03;print mktime2019 4 26 1 2 3}我会避免将变量放入日期格式:如果某些%X格式化程序最终出现在csv文件中怎么办?使用echo或printf更可靠`我假设CSV行的格式如问题所示:YYYY-M[M]-D[D],[un]。如果您开始假设日期可能包含奇怪的字符,则所有答案都无效。我会避免将变量放入日期格式:如果csv文件中出现某些%X格式,该怎么办?使用echo或printf更可靠`我假设CSV行的格式如问题所示:YYYY-M[M]-D[D],[un]。如果您开始假设日期可能包含奇怪的字符,则所有答案都无效。通常,星期一是第一天。对于%w,星期日是第0天;对于%u,星期天是第7天。通常,星期一是第1天。对于%w,星期日是第0天;对于%u,星期天是第7天。