2015-06-26 29 views
0

數據從我的應用程序之一的製表符分隔的日誌記錄是這樣的:在awk或sed的解析從日誌文件

Time UserId CustomField CityId 
2015-06-16-12:36:39 _v0YurN20wyj5h5QNIfoKA st=prefooter300x253;aa=855677;aam=91363629792766391842337900189790343745;kw=4onews;kw=5vo1bw;kw=671l7s;sqt=4 1023191 
2015-06-16-12:00:08 7ovC6FHLKjMxJpiZHvlDGQ st=xrailtop300x250;aam=86662686616919269952594761014252363053;kw=240000;kw=240001;kw=240002;kw=240003;kw=240004;kw=240005;kw=240006;kw=240007;kw=240008;px=240002;px=240003;sov=4;sqt=4 1028057 
2015-06-16-12:04:41 ZBV9KBZjMmkOcst7j2r8wA st=yrailtop300x250;aam=67657135077785797411906987077419372156;kw=top_of_the_rock_news;rfsh=0;sov=14;sqt=9 1025202 
2015-06-16-13:05:42 ABf9KBZjMmkOcst7j2r8w4 st=yrailtop300x250;aam=95657135077785797411906987077419372142;kw=liquid_cow_found_on_Mars;kw=2305;kw=stars_don't_care_about_astronomy;rfsh=0;sov=14;sqt=9 1025202 
2015-06-16-13:05:42 1tf9KBZjMmkOcst7j2r8y2 st=yrailtop300x250;kw=liquid_cow_found_on_Mars;rfsh=0;sov=14;sqt=9 1025202 

我需要用awk攝取到數據庫之前預先處理。只想保留Time,UserID以及CustomField的一部分(當存在時總是「aam」值,而只有當字符串長於16個字符時才爲「kw」值)。我可能會忽略kw部分或稍後處理它。

編輯:所需的輸出應該是這樣的

Time UserId RecordNo NewsItem1 NewsItem2 
2015-06-16-12:36:39 _v0YurN20wyj5h5QNIfoKA aam=91363629792766391842337900189790343745 NA NA 
2015-06-16-12:00:08 7ovC6FHLKjMxJpiZHvlDGQ aam=86662686616919269952594761014252363053 NA NA 
2015-06-16-12:04:41 ZBV9KBZjMmkOcst7j2r8wA aam=67657135077785797411906987077419372156 kw=top_of_the_rock_news 
2015-06-16-13:05:42 ABf9KBZjMmkOcst7j2r8w4 aam=95657135077785797411906987077419372142 kw=liquid_cow_found_on_Mars kw=stars_don't_care_about_astronomy 
2015-06-16-13:05:42 1tf9KBZjMmkOcst7j2r8y2 NA kw=liquid_cow_found_on_Mars NA 

EDIT2:我接受了答案。按照埃德的建議,我在原始文章中增加了兩個不存在的記錄,涵蓋了不尋常的記錄(沒有aam值或多個合法kw值)。如果找到多個千瓦值,只有前兩個將保持在NewsItem1和NewsItem2,其餘的將被忽略

+0

顯示您想要的樣本輸入輸出。 – Cyrus

回答

2
$ cat tst.awk   
BEGIN { FS=OFS="\t" } 
{ 
    if (NR==1) { 
     aam = "RecordNo" 
     kw = "NewsItem" 
    } 
    else { 
     aam = kw = "NA" 
     split($3,a,/;/) 
     for (i=1; i in a; i++) { 
      if (a[i] ~ /^aam/) { 
       aam = a[i] 
      } 
      if ((a[i] ~ /^kw/) && (length(a[i])>16)) { 
       kw = a[i] 
      } 
     } 
    } 
    print $1, $2, aam, kw 
} 

$ awk -f tst.awk file 
Time UserId RecordNo  NewsItem 
2015-06-16-12:36:39  _v0YurN20wyj5h5QNIfoKA aam=91363629792766391842337900189790343745  NA 
2015-06-16-12:00:08  7ovC6FHLKjMxJpiZHvlDGQ aam=86662686616919269952594761014252363053  NA 
2015-06-16-12:04:41  ZBV9KBZjMmkOcst7j2r8wA aam=67657135077785797411906987077419372156  kw=top_of_the_rock_news 

你沒有說或顯示要發生,如果超過16多萬千瓦值不再是什麼字符是存在的,或者如果aam不在,你想要做什麼。如果其中任何一個可能發生,請編輯問題中的示例輸入/輸出以顯示它。