linux如何在内部重定向IO工作

时间:2014-06-13 19:40:58

标签: linux shell

当我们对shell脚本使用重定向IO操作符时,操作员会将所有数据保存在内存中并一次写入或者逐行写入文件。

这是我正在做的事情。

我有大约200个小文件〜每行1000个特定格式的文件。我想处理(做一个正则表达式并稍微改变格式)所有文件中的每一行,并将新的转换行放在一个组合文件中。

我有一个transformscript.sh,它接受一个文件并应用转换。我按以下方式运行

sh transformscript.sh somefile.txt > newfile.txt

这对于单个文件来说效果很好。

如何扩展为所有文件执行此操作。更改transformscript.sh以将目录作为参数而不是文件名并添加for循环以将所有文件的所有行转换为一起是否有效。或者我应该为每个文件运行上面的trnsformscript.sh并为每个文件创建一个新文件然后单独组合。

感谢。

1 个答案:

答案 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文件中,并将新内容保留在原始名称的文件中,这可能不是您想要的。