首页 > 解决方案 > 有没有办法更新正在读取循环的同一文件?

问题描述

我有一个 while 循环逐行读取文件。基于某些条件,我想删除同一个文件的几行以减少循环时间(因为文件有数百万行)。有没有可能的方法?下面是代码示例:

while read -r line
do
<Processing>
sed -i "/<pattern>/d" $file
done < "$file"

当我运行上面的代码时,它不会在运行时删除行。我只能在循环结束后看到更新的 $file(这不会减少循环时间)。

标签: bashshellunixoptimizationtime

解决方案


认为会发生以下情况:

  1. Bash打开一个指向当前由$file.
  2. read读取文件指针的第一个换行符。
  3. sed读取当前引用的 inode $file,创建一个具有相同路径但不同 inode的新文件,其中包含原始文件中某些行的副本。
  4. 从 2 开始重复。

基本上,这不会进行就地替换,因为read不断从一个 inode 读取并sed不断创建具有包含新内容的相同路径的新 inode。

更快的解决方案是构建一个包含所有替换的sed 脚本,并在循环后运行一次。脚本看起来像这样:

/foo/d
/bar/d
…

或这个:

/foo\|bar\|…/d

推荐阅读