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

时间:2015-12-01 20:26:10

标签: 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 the end of the loop

temp.txt
a
b
c
d
e
f

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

4 个答案:

答案 0 :(得分:2)

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

sort -u *.txt > all

如果文件很大并且必须在一个文件级别进行排序,则可以执行

sort -u $f all -o all

答案 1 :(得分:1)

你有两个问题 您正在使用outputfile作为输入(如其他人所述)并且您在每个循环中覆盖输出文件。请参阅下一个不正确的修复

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

此代码将重置每个f的输出文件。请记住:当您在循环中重定向到文件时,请始终追加(>> "temp1.txt")。

问题似乎与丑陋的循环有关:<​​/ p>

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"

sort -u app1/* > "temp.txt"

答案 2 :(得分:0)

您可能希望追加 - 使用double angle-bracket

 sort -u $f "temp.txt" >> "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

答案 3 :(得分:0)

在启动命令之前,shell进程重定向。所以

sort foo bar > bar

首先截断“bar”为零字节。然后sort命令有“普通”foo文件和一个现在条文件可供使用。

参考:http://www.gnu.org/software/bash/manual/bashref.html#Redirections