删除不包含在filename_date中的日期的行

时间:2015-02-27 23:55:34

标签: awk sed

我有一个包含每月数据文件的文件夹,其中包含感兴趣的月份。

  

ie:data_06.csv

在每个文件中,我有平均每小时值,但由于生成这些数据集的查询中的时区偏移,每个data_month文件包含上个月的一个小时值,只有该月是经历夏令时的那个月。重点是,并非文件夹中的每个文件都有这样的问题。

我想要一个滚动浏览文件夹的脚本,如果它以一个不在标题中的月份开头,则删除一行。

以下是来自名为data_06.csv的文件的一些数据:

> 05-31-23  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
> 06-01-00  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
> 06-01-01  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
> 06-01-02  Airport 189 379 41  49.70946503 -124.91377258   1   0.0

如果每个文件中只有一组日期,那将是直截了当的,因为我只删除第一条记录,但每个月有多个小时值。换句话说,在上述机场数据集完成后,开始:

05-31-23    AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-00    AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-01    AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-02    AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-03    AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0

关注:

以下解决方案部分完成了工作,我现在需要的是弄清楚如何将每个文件的第一行(标题)添加到新文件中。

这是我的尝试无效......

NR == 1{print > (FILENAME ".new")};
{ month = FILENAME; gsub("[^0-9]","", month) }
$1 == month {print >> (FILENAME ".new")}

我可以将第1行打印到粗壮,但不能打印到我随后打印(追加)到的文件。感谢最后的帮助!

1 个答案:

答案 0 :(得分:2)

这可能是一种方法。使用awk内置变量FILENAME将月份从文件名中拉出。然后使用-作为字段分隔符,将月份与行的第一个字段进行比较。如果它们相同,则将该行打印到具有相同名称的新文件,并添加.new作为后缀。这样,您可以在一个命令中处理多个文件,并在完成后使用“.new”版本。

编辑:在输出中包含每个文件的标题。

编辑2:按照评论中的建议将FS的设置移至开始阻止。

$ cat data.awk
BEGIN { FS = "-" }
FNR == 1 { print > (FILENAME ".new"); next }
{ month = substr(FILENAME,6,2) }
$1 == month { print > (FILENAME ".new") }

$ cat data_06.csv
Data 06 header
05-31-23  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-00  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-01  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-02  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
05-31-23  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-00  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-01  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-02  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-03  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0

$ cat data_07.csv
Data 07 header
06-31-23  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-00  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
07-01-01  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
07-01-02  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
05-31-23  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-00  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
07-01-01  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
07-01-02  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
07-01-03  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0

$ awk -f data.awk data_*.csv

$ ls *.new
data_06.csv.new     data_07.csv.new

$ cat data_06.csv.new
Data 06 header
06-01-00  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-01  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-02  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
06-01-00  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-01  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-02  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
06-01-03  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0

$ cat data_07.csv.new
Data 07 header
07-01-01  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
07-01-02  Airport 189 379 41  49.70946503 -124.91377258   1   0.0
07-01-01  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
07-01-02  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
07-01-03  AlberniElementary   165 331 16  49.26100922 -124.80662537   4   0.0
相关问题