【问题标题】:How to delete duplicated rows with several files?如何删除包含多个文件的重复行?
【发布时间】:2011-06-12 08:42:46
【问题描述】:

我在不同的目录和子目录中有7个文件名如下

tag0.txt, tag1.txt, tag2.txt, tag3.txt, tag01.txt, tag02.txt and tag03.txt

其中一些文件有重复的行。如何删除duplicated rows?请注意,每个文件中的行没有排序,每个文件的长度范围从 500 到 1000 行。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你的意思是在每个文件中重复,还是在多个文件中重复?

标签: perl bash awk unix


【解决方案1】:

假设您想逐个删除重复文件,以下内容不需要对文件进行排序,因此不会弄乱行的顺序:

awk '!a[$0]++' infile > outfile

由于您的文件似乎位于不同的目录中,因此手动运行该命令 7 次可能是最简单的。如果你真的想这样做,你可以像这样循环它:

#!/bin/sh

for file in /path/to/file1 /path/to/file2 ... /path/to/file7; do
    awk '!a[$0]++' "$file" > "$file".new && \
    mv "$file".new "$file"
done

【讨论】:

  • 对不起,我喜欢保持相同的名字。之后我们需要重命名它们吗?
  • @Tony 是的,您需要重命名它们。我刚刚更新了我的 while 循环来为你做这件事。我会先备份你的 7 个文件,以防万一出现问题。
  • +1 您可以使用awk ... && mv ...,因此mv 取决于 AWK 命令是否成功。
【解决方案2】:

使用 sortuniq 命令,它们是 unix 实用程序

cat "your files" | sort | uniq

【讨论】:

  • -1 这不适用于上述要求,不会从文件中删除行。
  • @VCBuddy 没有什么能阻止您将输出重定向到实际文件(但当然不是源文件)
  • -1:似乎问题是依次处理每个文件,而不是创建单个文件。
  • @Dennis +1,有人应该为此制作愤怒漫画 =)
【解决方案3】:

注意,确实“直接”更改文件(就地编辑)。

perl -i -ne 'print if not $seen{$ARGV}{$_}++' file1 file2 file3 ...

【讨论】:

    【解决方案4】:

    bash 4.0++

    shopt -s globstar
    for file in **/tag*.txt
    do
        sort $file|uniq > t && mv t $file
    done
    

    【讨论】:

    • sort|uniqsort -u 不同吗? (真正的问题,不是讽刺)
    • @glenn AFAIK,不,如果您不使用 uniq 的任何选项,则没有区别。
    • 不幸的是,globstar 在这里不会做太多事情,因为他的“标签”文件不仅在不同的子目录中,而且在不同的根目录中。
    • @SiegeX,如果他知道这些根目录在哪里,只需使用 for 循环指定它们即可。 globstar 就像递归 find 一样,所以认为它仍然有用。
    • @glenn。是的,我也可以使用 sort -u 。它与 uniq 没有区别,因为我认为 OP 不需要使用 uniq 功能。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多