使awk快速拆分

时间:2016-07-25 11:29:52

标签: shell unix awk

我想将一长串数据拆分成多个变量并输出到文件中。我基本上只挑选这长长的数据所需的内容。这就是我的工作正常。但它的TOO SLOW适用于大型数据文件。

data in out
------------
out="date:21.05.2015#1time:22.00.05#2host:hostname1#3server:managed22#4msg:text_data#5from=system1#6to=system2#7seq=12dfr#8compName=traffic_sys#9type=bus123#10text=message_head,message_body;junkdata"

awk stmt
--------
echo $out | awk '{split ($0, a, "date:");VAR=a[2];split (VAR, a, "#1");date=a[1];VAR=a[2];split (VAR, a, "time:");VAR=a[2];split (VAR, a, "#2");time=a[1];VAR=a[2];split (VAR, a, "host:");VAR=a[2];split (VAR, a, "#3");host=a[1];VAR=a[2];split (VAR, a, "server:");VAR=a[2];split (VAR, a, "#4");server=a[1];VAR=a[2];split (VAR, a, "msg:");VAR=a[2];split (VAR, a, "#5");msg=a[1];VAR=a[2];split (VAR, a, "from=");VAR=a[2];split (VAR, a, "#6");from=a[1];VAR=a[2];split (VAR, a, "to=");VAR=a[2];split (VAR, a, "#7");to=a[1];VAR=a[2];split (VAR, a, "seq=");VAR=a[2];split (VAR, a, "#8");seq=a[1];VAR=a[2];split (VAR, a,"compName=");VAR=a[2];split (VAR, a, "#9");compname=a[1];VAR=a[2];split (VAR, a,"type=");VAR=a[2];split (VAR, a, "#10");type=a[1];VAR=a[2];split (VAR, a, "text:");VAR=a[2];split (VAR, a, ",");text=a[1];OFS="~dlimit~"; outVAR=date " " time;print seq,outVAR,msg,from,to,type,compname,text,host,server,$0 > "prad.out";}'

你能建议一种方法来更快地做到这一点吗?当前速度为269K记录,处理时间为29分钟。感谢。

1 个答案:

答案 0 :(得分:1)

您可以将awkmultiple delimiters一起使用,如下所示:

bash-4.1$ out="DATE:23072016#1TIME:060000#2HOST:managed2#3SERVER:host1234"
bash-4.1$ echo $out | awk -F'[:#]' '{date=$2; time=$4; print date, time}'
23072016 060000

您可以扩展上面的示例以满足您的需求。我没有测试过性能,但我很确定这应该比调用多个split更快。

注意:仅当字段固定时才会起作用,因为日期是第一个字段后跟时间等等。