awk處理實記

2022-07-22 03:30:19 字數 1392 閱讀 6009

經grep日誌後得到的資料格式如下:

}

.[debug][

2019-05-20

00:00:00

] senddatastyled:,,],

"roomid

" : "

6189269620",

"vid" : 1205

}

希望將一條原始資料處理後,生成若干條以下格式的資料:

time al_win alter_money uid roomid

確定分隔符。 原本是想用空格,「[」, 「]」,三個符號做分隔的,實驗後發現由於列印格式的問題,很多字段前面都有很多個空格,這樣不太好數需要的字段編號。所以最後分隔符定為中括號,雙引號,冒號,逗號。

確定所需欄位分隔後的編號。 根據分隔符數一下,然後通過命令列驗證一下就可以了。這個還是很容易且快的。

思考如何組織並輸出資料。 基本想法是除了要重複用到的time和roomid儲存一下,其它欄位是拿到後就直接列印,讀取uid之後,列印uid及roomid就進行換行。有點困難的是roomid的讀取,因為awk是按行順序處理的,乙個uid列印一行資料的話就等不到讀後面的roomid了。幸好發現在資料innings裡實際上隱含著roomid,拿到innings後用「_」擷取前面一段就可以了。

實操。整個路徑看起來是挺簡單的,實際上用了我好幾個小時才寫出了完整可用的awk。特此記錄下遇到的問題及得到教訓。

盡量用awk指令碼寫,不要在命令列直接寫。 也是因為只稍微複習了下語法就開始的原因,不知道可直接寫在檔案裡呼叫,在命令列寫極易出錯,不易閱讀,而且修改起來相當痛苦。

自定義變數的生命週期。 不說太深,只說現今用到的。awk我們日常用到的自定義變數基本都是全域性變數,直接使用就可以了。只是要注意下自己的程式應當在什麼時候對變數進行初始化。如果只初始化一次,就在begin裡寫;如果需要在具體的行裡多次初始化,在begin不用初始化也可以直接用。

變數的使用。 也是由於複習不到位的問題,沒有注意到使用變數時不需要使用$,比如要列印nf變數,直接print nf即可。因為這個小問題,走了不少彎路,深刻的教訓。

printf 的隨意性。 如果沒有定義具體的列印格式,printf後接空格,再接要列印的變數名或字段就可以了,用逗號或空格分隔都可以。要列印的所有變數可以用小括號包起來,也可以不包起來。不得不說,真的是強!

定義分隔符在命令列和指令碼裡的不同。 以上文確定的分隔符為例,在命令列應該寫作 -f '

[":,]

' , 在指令碼裡則應該在begin裡寫成 fs="

[\":,]";

。最後,貼上寫完的指令碼:

source.awk

begin 

直接使用 awk -f source.awk data.log > res.txt 即可。

awk 字段處理

基本用法 awk 條件動作1 條件動作2 filename概述 1.awk為行處理字段,預設字段分割為空格 或 tab 2.表示動作 command 條件型別置於 外,最後用單引號 括住 3.當條件型別為if語句時,要置入動作內 4.awk所有動作中,中,若有多個輔助命令,可用 或enter隔開 5...

awk邊學邊記

awk中的rs ors fs ofs的簡要說明 縮寫我認為的全拼 含義預設值 rsrow separator awk讀取檔案時的行分隔符 預設為 n orsoutput row separator awk輸出時的行分隔符 預設為 n fsfield separator awk讀取檔案時的列 字段 域...

awk多檔案處理

a.txt內容如下 a 150 b 200 c 100 b.txt內容如下 abcd a 12.5 bbbb b 35 cccc c 42 dddd d 21 想要通過a.txt b.txt得到ba.txt abcd a 12.5 150 bbbb b 35 200 cccc c 42 100 dd...