我在一个合并文件(即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点)
答案 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
}