我目前正在开发一个更大的脚本,但我无法让这个功能正常运行。
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文件只包含通过循环传递的最后一个文件的数据。
答案 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