awk學習示例

2021-09-01 15:41:32 字數 2755 閱讀 5564

sed和

awk一直是文字分析的神器,最近學習了陳皓的兩篇博文,小試牛刀如下。

1.

背景

有些map/reduce

資料產出之後,對於

value

數量不足的記錄,要求在資料端予以補全。在這裡,我們要求每條記錄中有10個

value

,用逗號,「

,」,進行分隔。

對於補全之後的結果,是不是可以保證每條記錄中有10個

value

,我們需要進行驗證。思路如下。

a)從hdfs

中匯出資料為文字格式;

b)使用awk

和sed

進行文字的分析;

c)根據結果得出結論。

下面是分析的步驟。

2.

分析步驟

2.1

資料匯出()

2.2

文字分析

原始的文字內容如下圖。主要是看下檔案的格式。原始內容過大,我們使用管道「|」和

more

命令防止輸出內容過多。

2.2.1原始文字內容

在這裡,第一列是

key,第二列是對應的

value

。我們主要關心

value

的數量。提取

value

的值如下。主要是列印第二列的內容。

2.2.2提取value

下面可以得到每行的記錄數量。在這裡,我們使用

fs重新定義了字段分隔符為「

,」,使用

nf獲取一條記錄中的列數,也就是

value

的個數。

2.2.3獲取每行的value的數量

然後使用

awk的統計功能,獲取每個

value

數對應的記錄數。如下圖。我們使用了

awk的陣列功能進行統計,然後使用

for迴圈將結果列印出來。

2.2.4獲取統計結果。

為了使結果看起來更友好,我們對結果進行

sort

排序,記得使用「

-n」引數,使其按照數字進行排序。另外,可以使用

wc命令統計檔案中的行數,即總記錄數,如下圖。

2.2.5最終結果

2.3

結論

根據上面的分析,我們得知檔案中總記錄為

1101522

,其中有10個

value

的記錄數有

1100253

,佔比99.8848%

。這個結果是可以接受的。

當然我們這裡的目的還是為了說明

awk和

sed的使用,下面是進一步的延伸。

2.4

更進一步

為了達到統計分析的目的,可以有多種方法。上面的只是一種,下面還有一種。

1)

awk '' a.txt | awk 'begin   ' | awk ' end ' | sort –n
2)

awk '' a.txt | sed 's/,/ /g' | awk ' end ' | sort –n
第乙個就是我們上面分析時使用的方案。

第二個中,思路是使用

sed將「,」替換為空格「

」,使其可以更方便的被分析,直接使用

nf即可。

另外,可以使用比較運算,找出特定個數的記錄。

awk '' a.txt | sed 's/,/ /g' | awk 'nf==10 ' | wc –l
通過修改不同的引數,結合

wc命令,可以得到特定

value

數的記錄數。這樣也可以實現我們的目的。

本來還想使用

split

函式直接在第一步就將

value

部分進行分割,但是沒成功;後面再試試。

3.

其它

上面的資料分析,在資料產出的時候也可以進行,直接使用

hive

進行統計。我們在這裡僅用來作為

awk和

sed學習的乙個示例。

4.

參考資料

awk:

《awk 簡明教程》

sed:

《sed 簡明教程》

awk 學習(三) 應用示例

awk簡單內建變數的使用 awk nr fnr nr fnr a b 輸入檔案a和b,由於先掃瞄a,所以掃瞄a的時候必然有nr fnr,然後掃瞄b的時候,fnr從1開始計數,而nr則接著a的行數繼續計數,所以nr fnr nr 已經讀出的記錄數 fnr 當前檔案的記錄數 fs 輸入字段分隔符 預設為...

awk程式設計基本使用示例

對於每一行,如果第三列大於0,則列印第一列,第二列 第三列的值 awk 3 0 file1 file2 f指定執行程式的檔案 awk f programfile inputfile 列印整行輸入 awk 或者 awk nr當前行數,nf當前行的列數,下面這個 是列印當前行的列數,第一列和最後一列 a...

awk十三問 AWK學習之旅

awk學習之旅 十三個常用命令行處理 root monitor awkdir cat emp.txt beth 4.00 0 dan 3.75 0 kathy 4.00 10 mark 5.00 20 mary 5.50 22 susie 4.25 18 1.不列印最後一列 awk begin nf...