bash - 有没有办法更新正在读取循环的同一文件?
问题描述
我有一个 while 循环逐行读取文件。基于某些条件,我想删除同一个文件的几行以减少循环时间(因为文件有数百万行)。有没有可能的方法?下面是代码示例:
while read -r line
do
<Processing>
sed -i "/<pattern>/d" $file
done < "$file"
当我运行上面的代码时,它不会在运行时删除行。我只能在循环结束后看到更新的 $file(这不会减少循环时间)。
解决方案
我认为会发生以下情况:
- Bash打开一个指向当前由
$file
. read
读取文件指针的第一个换行符。sed
读取当前引用的 inode$file
,创建一个具有相同路径但不同 inode的新文件,其中包含原始文件中某些行的副本。- 从 2 开始重复。
基本上,这不会进行就地替换,因为read
不断从一个 inode 读取并sed
不断创建具有包含新内容的相同路径的新 inode。
更快的解决方案是构建一个包含所有替换的sed
脚本,并在循环后运行一次。脚本看起来像这样:
/foo/d
/bar/d
…
或这个:
/foo\|bar\|…/d
推荐阅读
- android - 使用 Retrofit 上传带有 Content Uri 的图像
- java - 在混合 scala/java 项目中何时选择 java 而不是 scala
- c++ - 如何在虚幻引擎 4 中将随机生成的连接房间地图复制到多人游戏?
- python - 如何删除附加信息在 Tensorflow 版本 >2.0 的设备中执行 op __inference_train_function_88100
- google-cloud-storage - Firebase 存储:对 Internet 公开特定目录下的文件
- javascript - 如何访问这些表单值?
- php - 在php中提交表单后会话丢失其数据或值
- reactjs - React Bootstrap 组件的无限循环
- python - 将单词的余弦相似度与 BERT 模型进行比较
- c - 指向指针的数组如何初始化正确而简洁的方法和使用它