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 –n2)
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...