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

时间:2019-04-26 13:45:12

标签: 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-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中获取文件以及如何合并两个类似于表的变量的方法吗?

3 个答案:

答案 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脚本时,需要学习以下代码:

  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,您只需阅读一次文件即可。

答案 2 :(得分:1)

仅使用Bourne shell,如果CSV文件中包含很多行,则效率低于awk:

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