文本如何去重?uniq awk

對於awk '!a[$3]++',需要了解3個知識點
1、awk數組知識,不說了
2、awk的基本命令格式 awk 'pattern{action}'
    省略action時,默認action是{print},如awk '1'就是awk '1{print}'
3、var++的形式:先讀取var變量值,再對var值+1

以數據
1 2 3
1 2 3
1 2 4
1 2 5
爲例,對於awk '!a[$3]++'
awk處理第一行時: 先讀取a[$3]值再自增,a[$3]即a[3]值爲空(0),即爲awk '!0',即爲awk '1',即爲awk '1{print}'
awk處理第二行時: 先讀取a[$3]值再自增,a[$3]即a[3]值爲1,即爲awk '!1',即爲awk '0',即爲awk '0{print}'
.............

最後實現的效果就是對於$3是第一次出現的行進行打印,也就是去除$3重複的行

轉自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1672726#pid11904888


sort和uniq

重複行通常不會造成問題,但是有時候它們的確會引起問題。此時,不必花上一個下午的時間來爲它們編制過濾器,uniq 命令便是唾手可得的好工具。

瞭解一下它是如何節省您的時間和精力的。進行排序之後,您會發現有些行是重複的。有時候該重複信息是不需要的,可以將它除去以節省磁盤空間。不必對文本行進行排序,但是您應當記住 uniq 在讀取行時會對它們進行比較並將只除去兩個或更多的連續行。下面的示例說明了它實際上是如何工作的:

1. 用 uniq 除去重複行

$ cat happybirthday.txt
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday Dear Tux!
Happy Birthday to You!

$ sort happybirthday.txt 
Happy Birthday Dear Tux!
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday to You!

$ sort happybirthday.txt | uniq
Happy Birthday Dear Tux!
Happy Birthday to You!

警告:請不要使用 uniq 或任何其它工具從包含財務或其它重要數據的文件中除去重複行。在這種情況下,重複行幾乎總是表示同一金額的另一個交易,將它除去會給會計部造成許多困難。千萬別這麼幹! 

2. 使用 -u 和 -d 選項     

$ sort happybirthday.txt | uniq -u
Happy Birthday Dear Tux!

$ sort happybirthday.txt | uniq -d
Happy Birthday to You!
 

您還可以用 -c 選項從 uniq 中獲取一些統計信息:

清單

3. 使用 -c 選項 
    
$ sort happybirthday.txt | uniq -uc
1 Happy Birthday Dear Tux!

$ sort happybirthday.txt | uniq -dc
3 Happy Birthday to You!
      

就算 uniq 對完整的行進行比較,它仍然會很有用,但是那並非該命令的全部功能。特別方便的是:使用 -f 選項,後面跟着要跳過的字段數,它能夠跳過給定數目的字段。當您查看系統日誌時這非常有用。通常,某些項要被複制許多次,這使得查看日誌很難。使用簡單的 uniq 無法完成任務,因爲每一項都以不同的時間戳記開頭。但是如果您告訴它跳過所有的時間字段,您的日誌一下子就會變得更加便於管理。試一試 uniq -f 3 /var/log/messages ,親眼看看。

還有另一個選項 -s ,它的功能就像 -f 一樣,但是跳過給定數目的字符。您可以一起使用 -f 和 -s 。 uniq 先跳過字段,再跳過字符。如果您只想使用一些預先設置的字符進行比較,那麼該怎麼辦呢?試試看 -w 選項。

轉自:http://weiyingjun.blog.hexun.com/55766273_d.html
發佈了106 篇原創文章 · 獲贊 120 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章