Bash目录排序问题 - 删除重复行?

时间:2015-12-01 14:29:47

标签: bash sorting unix directory duplicates

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

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

正如您所看到的那样,它并没有删除副本" A B C" 2.txt中的行也是在1.txt中找到的。每个文件中的所有行都应保持唯一,并且应删除所有重复项。

2 个答案:

答案 0 :(得分:0)

这可能应该使用perl -i

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

这似乎在app1中创建.bak个文件(尽管手册页说它赢了),您可能希望在使用rm app1/*.bak验证结果后消除这些文件。

答案 1 :(得分:0)

  

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

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