2017-06-23 49 views
0

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

会有每天目录中的24个文件,我需要过滤掉基于其名称格式这些文件:

foofoo_2017052101502.csv 

foofoo_2017052104502.csv 

foofoo_2017052104503.csv 

foofoo_2017052204501.csv 

foofoo_2017052204504.csv 

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

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

+0

为什么不'cat foofoo_20170521 * .csv> combined_20170521.csv'? –

+0

如果可以,请您接受答案 –

回答

1

以下脚本将计算前一天的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}`  

时加入提到将过滤文件的名称为基于当前时间戳记前一天的脚本这些命令。

+0

在这种情况下会是什么样的var2? –

+0

这是dt字符串。它现在应该工作。 –

+1

根据操作系统提供各种'日期'实现方面的差异很好。 –

1

你可以让bash做过滤你使用globbing的,例如仅列出了日期的文件May 21, 2017你可以使用:

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

如果你想能够调用你的脚本参数指定日期有更多的灵活性,你可以使用:

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

然后打电话给你的脚本要过滤作为参数日期:

./your_script 20170521 

而作为@大卫C.兰在评论中提到,一个很实际的方式做这将是从你想进入一个CSV文件,你会然后在您的脚本中使用的日期串联的所有文件:

cat foofoo_20170521*.csv > combined_20170521.csv 
+1

也应该提到'cat'和*重定向*。 (请参阅原始问题的评论) –

+0

@ DavidC.Rankin这是一个非常聪明的方法。我更新了我的答案以包含它。 – archemiro

+1

':''是的,每隔一段时间,'猫'实际上可以用于其预期目的。 –