当我们对shell脚本使用重定向IO操作符时,操作员会将所有数据保存在内存中并一次写入或者逐行写入文件。
这是我正在做的事情。
我有大约200个小文件〜每行1000个特定格式的文件。我想处理(做一个正则表达式并稍微改变格式)所有文件中的每一行,并将新的转换行放在一个组合文件中。
我有一个transformscript.sh,它接受一个文件并应用转换。我按以下方式运行
sh transformscript.sh somefile.txt > newfile.txt
这对于单个文件来说效果很好。
如何扩展为所有文件执行此操作。更改transformscript.sh以将目录作为参数而不是文件名并添加for循环以将所有文件的所有行转换为一起是否有效。或者我应该为每个文件运行上面的trnsformscript.sh并为每个文件创建一个新文件然后单独组合。
感谢。
答案 0 :(得分:0)
您可能不希望为每个文件单独运行脚本,因为每次传递都会产生bash进程创建的开销。例如:
# don't do it this way
for somefile in $(ls somefiles*.txt); do
newfile=${somefile//some/new}
sh transformscript.sh $somefile > $newfile
done
上面为每个找到的文件启动了一个shell,效率非常低。如果可能的话,最好重写transformscript.sh来处理多个文件。根据转换的复杂程度以及是否需要保留原始文件名,您可以使用单个sed进程。例如,假设您有200个名为test1.txt的文件通过test200.txt,所有文件都带有“Hello world”行,您想要更改为“Hello joe”。你可以做一些简单的事情:
sed -i.save 's/Hello world/Hello joe/' test*.txt
-i告诉sed进行“就地”编辑(编辑原始文件),并且在编辑原始文件之前,-i的可选“.save”参数使用.save扩展名制作原始文件的备份副本文件。请注意,这会将原始内容保留在.save文件中,并将新内容保留在原始名称的文件中,这可能不是您想要的。