【问题标题】:Eliminate duplicate lines from multiple files using awk or sed使用 awk 或 sed 消除多个文件中的重复行
【发布时间】:2015-12-05 04:01:51
【问题描述】:

我想知道如何消除多个文件中的重复行。我使用这个命令来获取重复的行,但它只显示了共同的行:

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

file3.txt:

ZZZ
....

file20.txt:

TTT

【问题讨论】:

  • 您能否提供一个简洁的示例来说明“消除多个文件中的重复行”的含义:每个文件中是否存在重复项,不同文件中是否存在重复行等,您想要吗?消除重复行的每一次出现,或每一次出现但一个?在这种情况下,如果多个文件中存在重复项,您希望在哪个文件中保留该行?
  • 我编辑了我的问题

标签: linux awk sed


【解决方案1】:

不要使用uniq-d 标志。这将只显示重复的行。

来自uniq --help

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

改为使用不带参数的uniq

sort *.txt | uniq | ...

或者,更简单地说,sort 可以为您唯一化:

sort -u *.txt | ...

【讨论】:

    【解决方案2】:

    您可以在 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 窗口中,输入 :@+return 以运行代码。

    另一种选择是:

    1. 将上面的代码保存到名为remove_duplicates.vim的文件中,然后
    2. 在 gVim 窗口中,输入 :source /path/to/remove_duplicates.vimreturn

    为了保存所有缓冲区,然后运行:xareturn

    【讨论】:

      【解决方案3】:
      awk '!Line[$0]++' *.txt
      

      即使存在于多个文件和/或同一个文件中,任何字符串也只会打印一次

      添加了新的 OP 约束(在每个 原始 文件中输出)

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

      对于 awk 中的重定向限制,输出从 FileX.txt 重定向到 FileX.txt.new。可以使用原始文件进行一些更改(不是直接请求的目的)

      【讨论】:

      • 也会保留顺序,不需要排序。
      • 对,未指定,因为 OP 使用排序(并且在输出时易于管道)。它使用更多的内存,通过数组索引将行保存在内存中,如果需要,多管道可以使用临时文件。
      猜你喜欢
      • 2023-03-17
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多