在shell中查找特定日期匹配使用正则表达式?

时间:2015-12-02 14:49:32

标签: regex shell scripting

我在一个合并文件(即main_file)中有大量文件名,这些文件名具有不同的命名转换,但它们都有一个共同的格式为date +%Y%m%d的日期示例:20151202它会出现在名称中间的某个位置。

  

main_file 文件包含的内容如下:

DTC_by_PV_201511220000_raw_out.snappy
Belle_Tire_201511230000_raw_out.snappy
Goodyear_Tire_201511220200_raw_out.snappy
Sams_Club_201511230000_raw_out.snappy
eTire_All_201511230200_raw_out.snappy

我想弄清楚我可以在shell脚本中使用的正则表达式来读取main_file并为我们在文件中找到的每个日期生成不同的文件。

  

在这种情况下,我们应该有2个文件 -

1. for date 20151122 and will contain :
    DTC_by_PV_201511220000_raw_out.snappy
    Goodyear_Tire_201511220200_raw_out.snappy
2. for date 20151123 and will contain :
    Belle_Tire_201511230000_raw_out.snappy
    Sams_Club_201511230000_raw_out.snappy
    eTire_All_201511230200_raw_out.snappy
  

注意 - 文件名后面的约定是日期,小时和分钟(如   -201511230200这里20151123是日期,0200是凌晨2点)

1 个答案:

答案 0 :(得分:1)

awk oneliner:

awk -F_ '{i=substr($(NF-2),1,8);dates[i]=dates[i] $0 "\n"}END{for(d in dates)print(dates[d]) > d}' main_file

这将创建一个日期为名称的文件,该文件只包含该日期的行。

扩展的细节......第一个动作在每一行上运行:

{
    i=substr($(NF-2),1,8);
    dates[i]=dates[i] $0 "\n"
}

它的作用是找到行的日期部分(如果字段分隔符是下划线,则是从末尾开始的两个字段)。它只使用substr来切割日期部分(而不是时间)。然后它将整行附加到给定日期的数组元素。

然后,最后它会打印到一个文件,该文件的日期为名称,对于找到的每个日期。

END {
    for(d in dates)
        print(dates[d]) > d
}