awk處理之案例四:sort加awk來過濾文本

編譯環境

   本系列文章所提供的算法均在如下環境下編譯經過。 java

【腳本編譯環境】Federa 8,linux 2.6.35.6-45.fc14.i686
【處理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【內存】 2025272 kB
linux

前言

    awk是腳本中出色的文本處理工具。源碼好像也是用C語言寫的。本系列會針對不一樣的案例,用awk來解決咱們所要的問題。 爲何會用awk呢?咱們固然可使用C語言或者java語言來對文本 作處理,但每次都要編譯會使人發瘋的。修改起來也麻煩,正所謂殺雞焉用牛刀。 而腳本的靈活便捷使得工做變得更加輕鬆容易。在shell腳本編程中,awk堪稱瑞士軍刀毫不爲過。 算法

    本系列文章均系筆者所寫,不免有一些錯誤或者紕漏,若是小夥伴們有好的建議或者更好的算法,請不吝賜教。 shell

正文

【場景】

   我有這樣一堆數據,這個模式大約3w條
我但願判斷出第二個域內重複的選項。而後重複的選項比較第四個域的大小,取出小的輸出第一個域,若是相同比較第三個域的大小,一樣取出小的輸出第一個域,若仍是相同則輸出第一個,這個該如何寫腳本或者awk判斷?
編程

   a.txt文本內容以下: 工具

11        elex337_u000014        9        0
12        elex337_Golden214        14        0
14        elex337_u000017        9        0
15        elex337_u000019        11        0
16        elex337_u000020        9        0
17        elex337_Lokio        9        0
18        elex337_u000022        19        0
19        elex337_u000023        11        0
20        elex337_u000024        14        0
21        elex337_swordas15        9        0
22        elex337_Koann        19        0
23        elex337_Vylex        26        0
24        elex337_u000028        19        0
25        elex337_u000014        1        0
26        elex337_Golden214        35        1
27        elex337_u000016        0        0
28        elex337_u000017        22        0
29        elex337_u000019        10        0
30        elex337_u000020        11        0
31        elex337_Lokio        9        0
32        elex337_u000022        9        0
33        elex337_u000023        32        0
34        elex337_u000024        9        0
35        elex337_swordas15        22        0
36        elex337_Koann        11        0
37        elex337_Vylex        22        0
39        elex337_u000042        11        0
40        elex337_u000043        10        0

   提取完以後,c.txt文本內容以下: spa

12        elex337_Golden214        14        0
36        elex337_Koann        11        0
17        elex337_Lokio        9        0
21        elex337_swordas15        9        0
25        elex337_u000014        1        0
27        elex337_u000016        0        0
14        elex337_u000017        9        0
29        elex337_u000019        10        0
16        elex337_u000020        9        0
32        elex337_u000022        9        0
19        elex337_u000023        11        0
34        elex337_u000024        9        0
24        elex337_u000028        19        0
39        elex337_u000042        11        0
40        elex337_u000043        10        0
37        elex337_Vylex        22        0

【代碼】

sort -k2,2 -k4,4n -k3,3n -k1,1n < infile |awk '!a[$2]++'

【解釋】

   sort是linux上一個十分強大排序工具。其用法是sort [options][(files)],由於這裏只用到字段排序,故就講一下字段排序的功能。 code

排序鍵值字段的類型
字母 說明
b 忽略開頭的空白
d 字典順序
f 不區分字幕的大小寫
g 以通常的符點數字進行比較,只適合用戶GNU版本
i 忽略沒法打印的字符
n 以整數數字比較
r 倒置排序的順序

   -km.n表示從第m個字段的第n個字符開始比較。 blog

   awk '!a[$2]++{print}' 是過濾掉重複的。 排序

做者

   出處:http://www.cnblogs.com/gina

   本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索