天天看點

awk筆記:使用awk進行文本處理

1.前言

在linux下開發,因為經常需要分析項目的日志檔案,以此來查找軟體功能可能的異常點,經同僚的介紹慢慢接觸了linux下的三大利器:grep,sed,awk,特通過以下例子來總結下自己的學習結果;

2.需求說明

從文本檔案内篩選出起始點坐标和結束點坐标,并将此結果資料構造sql語句,最後使用sql将資料插入到對應表中;

操作步驟大體如下:

a.篩選出坐标資訊;

b.過濾資料:包括删除重複行,去掉異常資料;

c.構造sql語句;

d.導入;

3.實作

a.檔案名為combine.log,其内容如下圖所示

awk筆記:使用awk進行文本處理

需要将其中的坐标資訊如(2375.40,-25.200),(2375.40,-6.200)資料給篩選出來;

b.篩選出坐标資料,我們先篩選出包含坐标的資料:

$cat combine.log | awk '{ print $6 }' | more
           

執行以上指令後的結果如下圖所示:

awk筆記:使用awk進行文本處理

PS:根據觀察a中的資料,可知坐标資料都在第6列裡,通過awk的$6,将這一列資料提出來并輸出到管道,将其作為下一步需要處理的資料來源;

c.利用awk按空格識别列的政策,對資料進行如下處理:

1)将逗号(,)替換為空格,使用sed進行處理;語句如下

$sed 's/\,/\ /g'
           

2)過濾掉其中重複的行;語句如下:

$awk '!a[$0]++'
           

3)去掉其中坐标列資料異常值為“-nan”的資料;語句如下:

awk '$3!="-nan" {print $0}'
           

比對未處理和處理後的資料記錄數:

沒有過濾之前,篩選出的記錄數,如下圖所示:

awk筆記:使用awk進行文本處理

通過增加篩選條件後的記錄數,如下圖所示:

awk筆記:使用awk進行文本處理

執行如下篩選語句

cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' | more
           

結果如下圖所示:

awk筆記:使用awk進行文本處理

d.擷取坐标資料并進行簡單處理,以便後續構造sql語句;

1)擷取資料,将第3,4列和第9,10列資料篩選出來;

awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'
           

2)将坐标拼成形如(x,y)的字元串;

awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'
           

檢視如下指令檢視篩選後的結果:

cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' |awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'| awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'| more
           

資料如下圖所示:

awk筆記:使用awk進行文本處理

e.構造sql語句,并将結果儲存到檔案;

awk '{printf("insert into dat_reader_path_combine(start_point,end_point) values(%s,%s);\n",$1,$2)}'
           

執行以下完整語句:

cat combine.log | awk '{print $6}' | sed 's/\,/\ /g' | awk '!a[$0]++' | awk '$3!="-nan" {print $0}' |awk '{printf("%s,%s %s,%s\n",$3,$4,$9,$10)}'| awk '{printf("\"%s\" \"%s\"\n"),$1,$2}'| awk '{printf("insert into dat_reader_path_combine(start_point,end_point) values(%s,%s);\n",$1,$2)}' > combine.sql
           

檢視conbine.sql的内容,如下圖所示:

awk筆記:使用awk進行文本處理

使用生成的combine.sql在資料庫内執行後的結果,如下圖所示:

awk筆記:使用awk進行文本處理

4.總結

a.使用awk可以非常簡答的删除篩選資料内的重複行;

b.使用awk的printf函數将坐标資料組成想要的字元串;

c.使用sed進行字元的查找替換;

d.利用awk按空格分隔資料的方式,進行資料的擷取;

5.測試資料檔案

連結: https://pan.baidu.com/s/1OUjsCGsG0o_8yr8AdxB6_A 提取碼: neym

繼續閱讀