Bash 输出文件为空,用于执行";查找“;使用GNU sed(gsed)

Bash 输出文件为空,用于执行";查找“;使用GNU sed(gsed),bash,file,sed,io,gnu-sed,Bash,File,Sed,Io,Gnu Sed,我有很多文件,每个都在一个目录中。我的脚本应该: 在文件中查找字符串。假设文件名为“results”,字符串名为“average” 然后将字符串行上的所有其他内容附加到另一个名为“allResults”的文件中。运行脚本后,文件“allResults”应包含与“results”文件相同的行数,如 allResults.txt(我想要的): 我的脚本可以找到我需要的东西。在脚本运行时,我在“allResults.txt”上做了一个“cat”,在“allResults.txt”的父目录上做了一个

我有很多文件,每个都在一个目录中。我的脚本应该:

  • 在文件中查找字符串。假设文件名为“results”,字符串名为“average”

  • 然后将字符串行上的所有其他内容附加到另一个名为“allResults”的文件中。运行脚本后,文件“allResults”应包含与“results”文件相同的行数,如

allResults.txt(我想要的):

我的脚本可以找到我需要的东西。在脚本运行时,我在“allResults.txt”上做了一个“cat”,在“allResults.txt”的父目录上做了一个“ls-l”。也就是说,我可以在屏幕上看到“find”的输出,“allResults.txt”的大小短暂增加,然后返回到0。问题是脚本完成后,“allResults.txt”为空。所以“find”的结果没有被追加/添加到“allResults.txt”中,而是被覆盖。 这是我的脚本(我使用“gsed”,GNU-sed,因为我是MacOSX用户):

#/bin/bash
#在所有目录上循环,查找。
让所有步骤=100000
对于((步骤=0;步骤>allResults.txt
完成

请注意,我在这里的示例中使用了“>>”,因为我读到它会附加(这是我想要的--一个与所有文件中的“find”匹配的所有行的列表),而“>”会覆盖。但是,在这两种情况下(当我使用“>”或“>>”),我得到了一个空的
allResults.txt
文件。

grep的默认行为是打印匹配的行。使用sed是过分的

您也不需要显式循环。事实上,过度循环是程序员通常从循环常见的其他语言导入的比喻。大多数shell命令和构造都接受多个文件名

grep average */experiment-1/results.dat > allResults.txt
这样做的好处是输出文件只打开一次,并且一次性写入

如果您确实要处理数十万个文件,您可能会遇到命令行长度限制。如果出现这种情况,您可以切换到
find
调用,以确保不会一次调用包含太多文件的grep

find . -name results.dat -exec grep average {} + > allResults.txt

看看这篇帖子:@GoinOff,谢谢。我确实看了一下并尝试实现Philipp Jone的解决方案。运气不好。我真的不理解他的语法(如何相应地修改我的代码)谢谢。我要花些时间消化这个问题。我会尝试。我习惯C++,很难处理好。谢谢。我试过你的建议。第一个导致GRP:*/I/实验1/结果。DAT:没有这样的文件或目录。第二个不幸的是,没有错误,但是“所有结果。TXT”。是空的。运行
find-name results.dat
打印它找到的所有文件。它找到了吗?我找到了,John。结果是“查找:非法选项--n”。有趣!玩
sort
。它有很多标志。
find…| sort>allResults.txt
grep average */experiment-1/results.dat > allResults.txt
find . -name results.dat -exec grep average {} + > allResults.txt