【问题标题】:Bash Directory Sorting Issue - Removing Duplicate Lines?Bash 目录排序问题 - 删除重复行?
【发布时间】:2016-03-05 12:26:40
【问题描述】:

我正在使用这个命令来合并多个相同的目录并从每个相应的文件中删除重复的行:

for f in app1/*; do 
   bn="$(basename "$f")"
   sort -u "$f" "app2/$bn" > "app/$bn"
done

有没有办法编辑它,以便检查所有文件的行并删除所有重复项?我确实需要将现有文件结构与单个文件一起保留。

最终结果会创建一个包含 300 个不超过 30mb 的文本文件的目录。

示例:

**Directory app1**
*1.txt*       
a
b
c

*2.txt*
d
e
f

**Directory app2**
*1.txt*
a
b
c
g

*2.txt*
a
b
c
d
e
f

**Results in Directory app**
*1.txt*
a
b
c
g

*2.txt*
a
b
c
d
e
f

Desired Result in Directory app Should Be:
*1.txt*
a
b
c
g

*2.txt*
d
e
f

正如您所见,当 2.txt 中也有重复的“A B C”行时,它并没有删除它。每个文件中的所有行都应保持唯一,并且应删除所有重复项。

【问题讨论】:

  • @MarcB - 这就是sort -u 所做的,不是吗?
  • 啊,是的。 ... 从来没有使用 sort 来做唯一性。习惯的力量 - 总是使用 uniq
  • nickyb,我不确定您现有的脚本如何无法实现您的目标。 sort -u file1 file2 file3 应该合并三个文件,对它们进行排序并将结果唯一化。你能澄清为什么这不是你想要的吗? “检查所有文件的行”是什么意思?你是说你想从当前循环实例之外的文件中获取 uniq 行吗?还是别的什么?
  • 我还是新手,但上面的脚本合并了相同的目录,我相信它只会删除相同文件中的重复项。它会从 a.txt 和 a.txt 中删除相同的文件,但不会从 a.txt 和 b.txt 中删除。我可能需要一个完整的单独命令来从整个目录中删除重复项,但我需要以保留现有文件名的方式执行此操作。
  • 删除相同的文件?还是相同的线?您是否要比较相同的文件或文件内容?据我所知,sort -u file1 file2 file3 在功能上等同于cat file1 file2 file3 | sort | uniq。您能否更新您的问题以显示示例输入数据以及您想要的结果?

标签: bash sorting unix directory duplicates


【解决方案1】:

这可能应该通过perl -i 来完成:

perl -i -n -e 'print unless $h{$_};++$h{$_}' app1/*

这似乎会在 app1 中创建 .bak 文件(尽管手册页说不会),您可能希望在使用 rm app1/*.bak 验证结果后将其删除。

【讨论】:

    【解决方案2】:

    如您所见,它并没有删除重复的“A B C”行 2.txt 当它也在 1.txt 中找到时。每个文件中的所有行都应保持唯一,并且应删除所有重复项。

    您可以通过将 7171u 对您的其他问题“Unix Bash Remove Duplicate Lines From Directory Files?”的回答应用于上述命令的结果来实现此目标(在他的脚本中将 tmp/* 更改为 app/* 之后,这应该是微不足道的)。

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 2021-05-02
      • 2012-07-16
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多