【问题标题】:Merging CSV files based on filename filter基于文件名过滤器合并 CSV 文件
【发布时间】:2017-11-27 08:08:13
【问题描述】:

我正在尝试开发一个 bash 脚本,用于过滤前一天的 csv 文件(每小时生成一次)并将它们合并到一个 CSV 文件中。 This 脚本似乎为我完成了这项工作,除了我试图根据文件名过滤文件。

目录中每天会有24个文件,我需要根据它们的名称格式过滤掉这些文件:

foofoo_2017052101502.csv

foofoo_2017052104502.csv

foofoo_2017052104503.csv

foofoo_2017052204501.csv

foofoo_2017052204504.csv

在这里,我需要过滤掉 2017 年 5 月 21 日。所以我的输出 CSV 文件必须包含前三个 .csv 文件。

我应该在这个过滤器的脚本中添加什么?

【问题讨论】:

  • 为什么不cat foofoo_20170521*.csv > combined_20170521.csv
  • 如果有效,请您接受答案

标签: bash csv


【解决方案1】:

您可以让bash 使用globbing 为您进行过滤,例如仅列出您可以使用的日期为May 21, 2017 的文件:

for filename in foofoo_20170521*.csv; do...

如果您希望能够使用指定日期的参数调用脚本以获得更大的灵活性,您可以使用:

for filename in "foofoo_${1}*.csv"; do...

然后使用您要过滤的日期作为参数调用您的脚本:

./your_script 20170521

正如@David C. Rankin 在 cmets 中提到的那样,一种非常实用的方法是将您想要的日期的所有文件连接到一个 csv 中,然后您将在脚本中使用:

cat foofoo_20170521*.csv > combined_20170521.csv

【讨论】:

  • 看来catredirection 也应该被提及。 (见对原始问题的评论)
  • @DavidC.Rankin这是一个非常聪明的方法。我更新了我的答案以包含它。
  • :) 是的,每隔一段时间,cat 实际上可以用于其预期目的。
【解决方案2】:

以下脚本将计算前一天的 yyyymmdd 并在 grep 中使用该值自动过滤掉前一天生成的所有文件名。

适用于 MacOS

dt=`date -j -v-1d +%Y%m%d`
echo $dt
OutputFiles=`ls | grep foofoo_${dt}`      

适用于 Linux

dt=`date -d "yesterday" +%Y%m%d`
echo $dt
OutputFiles=`ls | grep foofoo_${dt}`      

这些命令在添加到提到的脚本时将根据当前时间戳过滤前一天的文件名。

【讨论】:

  • 在这种情况下 var2 是什么?
  • 很好地提供了各种date 实现之间的差异,具体取决于操作系统。
  • 感谢大卫 C 兰金
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2021-12-11
  • 2019-07-13
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多