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


編譯環境

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

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

前言

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

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

正文

【場景】

   我有這樣一堆數據,這個模式大約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文本內容如下:

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)],因為這里只用到字段排序,故就講一下字段排序的功能。

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

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

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

作者

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

   本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM