Linux系統下如何刪除文本中的重複行

      在Linux系統中,如果要刪除文本中的重複行,可以如何做?

      平時比較常用的方式是採用sort和uniq結合來處理.但如果要更進一步,根據文本中的某一列,而不是整行

來進行是否重複的判斷,並對重複行進行刪除,要如何做呢?

      Google了一些資料,如下:

      1. 槍聲依舊 Linux下利用awk進行文本統計

      2. sed與awk去除重複行

      3. awk 不排序刪除重複行

 

      其中,在1)中,介紹了下面這種方法來解決上面提出的問題:

awk '!a[$0]++' src.txt > dest.txt 

 

      而對這種方法的解釋,在3)做了描述,下面是一段轉貼:

 簡要解釋一下,awk 的基本執行流程是,對文件的每一行,做一個指定的邏輯判斷,如果邏輯判斷成立,則執行指定的命令;如果邏輯判斷不成立,則直接跳過這一行。

我們這裏寫的 awk 命令是 !x[$0]++,意思是,首先創建一個 map 叫 x,然後用當前行的全文 $0 作爲 map 的 key,到 map 中查找相應的 value,如果沒找到,則整個表達式的值爲真,可以執行之後的語句;如果找到了,則表達式的值爲假,跳過這一行。由於表達式之後有 ++,因此如果某個 key 找不到對應的 value,該 ++ 操作會先把對應的 value 設成 0,然後再自增成 1,這樣下次再遇到重複的行的時候,對應的 key 就能找到一個非 0 的 value 了。

注:該處的map類似於array數組,只不過在awk中叫array不恰當。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章