Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 删除文件名中不包含日期的行\u date_Awk_Sed - Fatal编程技术网

Awk 删除文件名中不包含日期的行\u date

Awk 删除文件名中不包含日期的行\u date,awk,sed,Awk,Sed,我有一个满是每月数据文件的文件夹,其中包含了感兴趣的月份 ie:data_06.csv 在每个文件中,我都有平均每小时值,但由于生成这些数据集的查询中的时区偏移,每个数据月文件只包含上个月的每小时值,如果该月是经历夏令时的月份。重点是,并不是文件夹中的每个文件都有这样的问题 我想要一个脚本,滚动通过一个文件夹,并删除一行,如果它开始的一个月,而不是在标题中 下面是名为data_06.csv的文件中的一些数据片段: > 05-31-23 Airport 189 379 41 49.709

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

ie:data_06.csv

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

我想要一个脚本,滚动通过一个文件夹,并删除一行,如果它开始的一个月,而不是在标题中

下面是名为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")}

我可以将第一行打印到stout,但不能打印到我随后打印(附加)到的文件中。谢谢你最后的帮助

这可能是一种方法。使用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

谢谢jas,我真的很喜欢这种方法:紧凑并且能够在多个文件上运行…我对内置的FILENAME变量很好奇…它基本上只是查看文件名并将其转换为字符串变量,然后在给定一些参数(gsub等)的情况下称为“月”吗?我会做一些阅读,但如果你有另一种解释,因为你建议使用它。再次感谢!我去投票表决你的答案,但我没有所需的15声誉,对不起:(好的,这很好;但是,它不会复制标题信息。我有一行列标题,因为第一个字段不匹配,所以不会复制到新文件中。是否有方法删除包含与标题月不同的月份的行,或者有方法跳过每个文件的第一行?我已经更新了。)d我的问题是为了打印第1行,然后执行你提出的解决方案。不客气,@geokrowding。我已经更新了答案,以包含标题。
FILENAME
是一个包含文件名的字符串变量。我将其分配给名为
month
的变量,然后我使用了
gsub
fun操作以空字符串替换
month
中的所有非数字字符,只保留两位数字。在编辑的版本中,我将其更改为只分配
month
一个子字符串
FILENAME
,从(1开始)第6位的长度为2。这似乎更简单,但我假设您所有的文件名都是
data\u MM…
格式,其中
MM
是月份数字。我已经更新了我的答案以打印标题。您基本上已经做到了,只是您希望使用
FNR
而不是
NR
FNR
不是当前文件中的记录编号,因此每个文件都将其重置为一个。
NR
是当前记录编号,包括所有文件。