删除包含不在 filename_date 中的日期的行
remove line containing date not in the filename_date
我有一个装满每月数据文件的文件夹,其中包含感兴趣的月份。
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
跟进:
下面的解决方案部分完成了工作,我现在需要的是弄清楚如何将每个文件的第一行(header)添加到新文件中。
我的尝试无效...
NR == 1{print > (FILENAME ".new")};
{ month = FILENAME; gsub("[^0-9]","", month) }
== month {print >> (FILENAME ".new")}
我可以将第一行打印到 stout,但不能打印到我随后打印(追加)到的文件。感谢最后的帮助!
这可能是一种方法。使用 awk built-in 变量 FILENAME
从文件名中提取月份。然后将月份与该行的第一个字段进行比较,使用 -
作为字段分隔符。如果它们相同,则将该行打印到具有相同名称并添加 .new
作为后缀的新文件。这样一来,您就可以在一个命令中处理多个文件,并在完成后拥有每个文件的“.new”版本。
编辑: 在输出中包含每个文件的 header。
编辑 2: 按照评论中的建议移动 FS 的设置以开始块。
$ cat data.awk
BEGIN { FS = "-" }
FNR == 1 { print > (FILENAME ".new"); next }
{ month = substr(FILENAME,6,2) }
== 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
我有一个装满每月数据文件的文件夹,其中包含感兴趣的月份。
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
跟进:
下面的解决方案部分完成了工作,我现在需要的是弄清楚如何将每个文件的第一行(header)添加到新文件中。
我的尝试无效...
NR == 1{print > (FILENAME ".new")};
{ month = FILENAME; gsub("[^0-9]","", month) }
== month {print >> (FILENAME ".new")}
我可以将第一行打印到 stout,但不能打印到我随后打印(追加)到的文件。感谢最后的帮助!
这可能是一种方法。使用 awk built-in 变量 FILENAME
从文件名中提取月份。然后将月份与该行的第一个字段进行比较,使用 -
作为字段分隔符。如果它们相同,则将该行打印到具有相同名称并添加 .new
作为后缀的新文件。这样一来,您就可以在一个命令中处理多个文件,并在完成后拥有每个文件的“.new”版本。
编辑: 在输出中包含每个文件的 header。
编辑 2: 按照评论中的建议移动 FS 的设置以开始块。
$ cat data.awk
BEGIN { FS = "-" }
FNR == 1 { print > (FILENAME ".new"); next }
{ month = substr(FILENAME,6,2) }
== 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