本系列文章所提供的算法均在如下環境下編譯經過。 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
本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。