2016-07-25 25 views
0

我想將一長串數據分成多個變量並輸出到一個文件中。我基本上只是從這一長串數據中挑選和選擇需要的東西。這是我有哪些工作正常。但是對於大型數據文件來說,它的TOO SLOW很慢。讓awk快速分裂

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";}' 

你能提出一種更快的方法嗎?目前的速度是在29分鐘內處理269K個記錄。謝謝。

+0

這有點寬泛。請嘗試提供[mcve],以便更清楚。另外,如何使用正則表達式匹配組? – fedorqui

+0

[編輯]你的問題,包括簡潔,可測試的樣本輸入(即擺脫所有'...'s)和給定輸入的預期輸出。現在我們可以幫助您編寫最高效的代碼,因爲您尚未向我們展示您想要代碼執行的操作。 –

+0

我認爲,示例源數據很有用。但是你的限制因素可能是文件IO,並沒有太大的幫助。 – Sobrique

回答

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更快。

注意:只有當字段是固定的,因爲日期是第一個字段後跟時間等等。

+0

謝謝Fazlin。但問題是,我的分隔符因不同領域而異。所以我無法使用通用的字段分隔符。你認爲可以有另一種方式來做到這一點? – user4923462

+0

從我輸入的字符串,我想我們仍然可以使用我的解決方案,而不用擔心'#'後面的數字,如果我使用':'和'#'作爲分隔符,如我編輯的文章中所述。 – Fazlin