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



我有一个.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 脚本时,这里有一些代码需要学习:

  1. 要读取 CSV 文件,并获取文件中每个日期的工作日编号,请执行以下操作:

    while IFS=, read -r date rest; do echo "$date,$(date -d "$date" +%w)"; done < file.csv
    
  2. 将该命令的输出与文件联接:

    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

最新更新