2013-04-05 89 views
1

試圖把一些屠宰數據到酒吧分隔,unbutchered數據...一次只設置一個字段?

這裏的一些樣本數據

asd1276vdjs12897364vsk Tue Apr 2 08:19:12 2013 [pid 3] [words] FAIL UPLOAD: Client "00.005.006.006", "/0801NSJH.bbf", 0.00Kbyte/sec 

asd1276vdjs12897364vsk|Tue Apr 2 08:19:12 2013|[pid 3]|[words]|FAIL UPLOAD: Client "00.005.006.006"|"/0801NSJH.bbf"|0.00Kbyte/sec 

正則表達式的是很簡單的,但我不」不知道怎麼說first field = regex, second field = regex

這個sed功能,但有點哈克,我想使它在gawk工作。

sed 's/ Sun/|Sun/' 
sed 's/ Mon/|Mon/' 
sed 's/ Tue/|Tue/' 
sed 's/ Wed/|Wed/' 
sed 's/ Thu/|Thu/' 
sed 's/ Fri/|Fri/' 
sed 's/ Sat/|Sat/' 
sed 's/ Sun/|Sun/' 
sed -e 's% \[%|\[%g' -e 's%\] %\]|%g' -e 's%, %|%g' 
+0

這是相當發現找到這樣一個正則表達式規則。 – sp00m 2013-04-05 17:14:13

+0

我刪除了正則表達式標記。這是一個關於awk/gawk的問題。 – 2013-04-05 17:18:54

+0

這個問題的問題是沒有一個很好的解決方案,我可以提供一個解決方案來修復這個例子,我可能會使用'printf'來格式化輸入,但我保證**文件中的其他行不會完全匹配格式/不。以田地爲例。 – 2013-04-05 17:31:13

回答

1
$ cat tst.awk 
{ print gensub(/\ 
([^[:space:]]+)[[:space:]]+\ 
([^[]+)[[:space:]]+\ 
([[][^]]+[]])[[:space:]]+\ 
([[][^]]+[]])[[:space:]]+\ 
([^,]+),[[:space:]]+\ 
([^,]+),[[:space:]]+\ 
/, 
"\\1|\\2|\\3|\\4|\\5|\\6|","") 
} 
$ awk -f tst.awk file 
asd1276vdjs12897364vsk|Tue Apr 2 08:19:12 2013|[pid 3]|[words]|FAIL UPLOAD: Client "00.005.006.006"|"/0801NSJH.bbf"|0.00Kbyte/sec