2015-09-09 70 views
1

我想知道如何消除多個文件中的重複行。我用這個命令來獲得重複的行,但它只能說明我在常見的線:使用awk或sed消除多個文件中的重複行

sort *.txt | uniq -d | fgrep -f - *.txt | sort -t : -k 2 

舉例來說,如果我有以下文件:

FILE1.TXT:

AAA 
BBB 
CCC 

FILE2.TXT:

AAA 
EEE 
FFF 

file3.txt:

BBB 
ZZZ 
... 

file20.txt:

AAA 
BBB 
TTT 

我想有作爲的結果:

FILE1.TXT:

AAA 
BBB 
CCC 

FILE2.TXT:

EEE 
FFF 

文件3 .txt:

ZZZ 
.... 

file20.txt:

TTT 
+1

你能提供你的意思是「消除重複的行從多個文件」是什麼一個簡潔的例子:是每個單獨的文件裏面有重複,是不同文件中的重複行,等等,你是否想要消除重複行的每一個出現,或每一次出現,但除了一個?在這種情況下,如果重複出現在多個文件中,您想保留哪一個文件? – Benoit

+0

我編輯我的問題 – malmo

回答

4

不要使用uniq-d標誌。這將只顯示重複的行。

uniq --help

-d, --repeated  only print duplicate lines, one for each group 

相反,使用uniq不帶任何參數:

sort *.txt | uniq | ... 

,或者更簡單,sort可以uniquify爲您提供:

sort -u *.txt | ... 
1
awk '!Line[$0]++' *.txt 

只打印一次任意字符串,即使目前在幾個文件中和/或在同一個文件

新OP約束的增加(每個文件輸出)

awk '!Line[$0]++ > (FILENAME ".new")' *.txt 

重定向awk中的限制,輸出從FileX.txt重定向到FileX.txt.new。原始文件可以使用一些變化(不直接要求的目的)

+0

也將保持順序,不需要排序。 – karakfa

+0

沒錯,因爲OP使用排序(並且易於輸出)。它使用更多的memroy,通過數組索引在內存中保留行,其中multipipe可以在需要時使用臨時文件。 – NeronLeVelu

1

你可以在Vim中做到這一點:打開gvim(例如)與所有文件作爲參數
然後

  1. 將以下代碼複製到剪貼板

    let g:duplicate_finder={} 
    function Remove_duplicates() 
        " Get the buffer lines 
        let buf_lines = getline(1, '$') 
        " Reduce the buffer to one empty line 
        execute '%d _' 
        " Append to the buffer only lines never encountered before 
        for cur_buf_line in buf_lines 
         if !has_key(g:duplicate_finder, cur_buf_line) 
          call append(line('$'), cur_buf_line) 
          let g:duplicate_finder[cur_buf_line] = '1' 
         endif 
        endfor 
        " Delete first line from the buffer 
        execute '1d _' 
    endfunction 
    argdo call Remove_duplicates() 
    

  2. 在gVim的窗口中,鍵入:@+回報運行代碼。

另一種方法是:

  1. 保存以上到名爲remove_duplicates.vim文件中的代碼,並
  2. 在gVim的窗口中鍵入:source /path/to/remove_duplicates.vim返回

爲了保存所有的緩衝區,然後運行:xa回報