編譯環境
本系列文章所提供的算法均在以下環境下編譯通過。
【腳本編譯環境】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
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
