2015-12-02 27 views
0

我有一個統一的文件(即main_file)文件名的一羣,這些文件的名稱都具有不同的命名轉換,但他們都有一個共同點,即是格式date +%Y%m%d例如日期:20151202,它會在中間出現一些地方名字。查找shell中正則表達式的具體日期匹配使用情況?

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

一個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 
}