2013-04-05 60 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