Bash循环是否使用相同的输出文件合并已排序的文件?

Bash循环是否使用相同的输出文件合并已排序的文件?,bash,sorting,unix,Bash,Sorting,Unix,我目前正在编写一个更大的脚本,但我无法让这个函数正常工作 for f in app1/*; do sort -u $f "temp.txt" > "temp.txt" done 目录app1中有一些文本文件。我试图做的是一个接一个地获取每个文件,并将其与temp.txt合并,以构建一个更新的排序后的temp.txt文件,而不重复 示例: temp.txt以空文件启动 app1/1.txt a b c d app1/2.txt d e f End result at

我目前正在编写一个更大的脚本,但我无法让这个函数正常工作

for f in app1/*; do 
         sort -u $f "temp.txt" > "temp.txt"
done
目录app1中有一些文本文件。我试图做的是一个接一个地获取每个文件,并将其与temp.txt合并,以构建一个更新的排序后的temp.txt文件,而不重复

示例:

temp.txt以空文件启动

app1/1.txt
a
b
c
d

app1/2.txt
d
e
f

End result at the end of the loop

temp.txt
a
b
c
d
e
f

我遇到的问题是temp.txt文件只包含通过循环的最后一个文件中的数据。

您可能希望附加-使用:

这可能是另一种方法:

reut@reut-work-room:~/srt$ cat 1.txt 
a
b
c
d
reut@reut-work-room:~/srt$ cat 2.txt 
d
e
f
reut@reut-work-room:~/srt$ sort -u *.txt > out.txt
reut@reut-work-room:~/srt$ cat out.txt 
a
b
c
d
e
f

如果合并的所有文件都不是很大,可以立即对它们进行排序:

sort -u *.txt > all
如果文件很大,并且必须在一个文件级别进行排序,则可以执行以下操作

sort -u $f all -o all

shell在启动命令之前处理重定向。所以

sort foo bar > bar
将首先条截断为零字节。然后,sort命令有一个“普通”foo文件和一个现在为空的bar文件

参考:您有两个问题。
您使用outputfile作为输入(如其他人所述),并在每个循环中覆盖outputfile。请参阅下一个错误修复

for f in app1/*; do 
         sort -u $f "temp.txt" > "temp1.txt"
done
此代码将为每个f重置输出文件。请记住:当重定向到循环中的文件时,请始终附加(
>“temp1.txt”

丑陋的循环似乎解决了这个问题:

for f in app1/*; do 
   cp temp.txt fix1.txt
   sort -u $f "fix1.txt" > "temp.txt"
done
应该采用的方法是在循环外写入输出。因为您从一个空的temp.txt开始,所以

for f in app1/*; do 
   sort -u $f 
done > "fix2.txt"
sort -u "fix2.txt" > "temp.txt"
或者@Andrey是对的,你能用吗

for f in app1/*; do 
   sort -u $f 
done | sort -u > "temp.txt"


无法重定向到要读取的同一文件。shell将在启动您重定向到其输出的程序之前截断该文件。是否应该
d
只出现一次?@ReutSharabani是的,所有重复项都应该删除,这样它只显示唯一的值。您可以删除上面的我的输出,但这就是使用该排序行的结果,因此它不会删除重复项。谢谢你让我知道append。我正在使用的脚本是从整个目录中删除重复的行。我需要能够将附加的临时文件与目录中的文件逐个进行比较,以检查并删除每个文件中的重复行,因此我无法一次对所有文件进行排序。@nickyb为什么必须逐个进行比较?临时文件中有什么要开始的吗?在您在问题中描述的设置中,我不明白为什么不能同时对所有文件进行排序。没有理由不在所有情况下使用
-o
标志。@BenjaminW。这个函数是我正在编写的一个更大的脚本的一部分,该脚本用于从目录中的每个文件中删除重复的行,从而使目录中的每一行都是唯一的。我需要这个函数能够创建一个附加的临时文件进行比较,以检查循环中的重复项。我基本上是一次一个文件地建立并附加一个黑名单。@nickyb即使你没有看到“更大问题”的解决方案,还是要问清楚。不要问一些你认为可能有效的中间问题(更糟糕的是,它不会)。XY问题很累人,浪费每个人的时间。谢谢你的努力,我能请你写一个短篇剧本吗?@Nickyb不,原因有二-1-我加入S.O.只是为了帮助人们并获得反馈,这样我才知道如何改进我的脚本编写。我有一份正常的工作-2-你应该先学习基础知识。如果没有一些经验,任何陌生人的剧本都会提出比它解决的问题更多的问题。
for f in app1/*; do 
   sort -u $f 
done | sort -u > "temp.txt"
sort -u app1/* > "temp.txt"