在Linux系統中,如果要刪除文本中的重複行,可以如何做?
平時比較常用的方式是採用sort和uniq結合來處理.但如果要更進一步,根據文本中的某一列,而不是整行
來進行是否重複的判斷,並對重複行進行刪除,要如何做呢?
Google了一些資料,如下:
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不恰當。