仅将 sed 应用于循环中最后一次匹配之后的文件部分 - shell / bash

问题描述 投票:0回答:1

所以我有几个这样结构的大文件(~1Gb):

fooA iug9wa 福阿·劳伊 fooA nwgoieb 福布·威尔格布 fooB rqgebepu fooB ifbqeiu ... fooN ibfiygb 傻瓜yvsiy fooN aeviu

我想在 shell 中将每个 fooX (包含字母、数字“.”和“_”)(我已全部列在 foo.list 中)替换为顺序数字 1 到 N

我用过:

`
nfoos=$(wc -l < foo.list)

for i in $(seq 1 $nfoos)
do
currentfoo=$(sed "${i}q;d" foo.list)
sed -i "s/"${currentfoo}"/$i/g" file1
sed -i "s/"${currentfoo}"/$i/g" file2
sed -i "s/"${currentfoo}"/$i/g" filen
done
`

但是,对于大文件来说,这会花费很长时间。 由于每个连续的 fooX 总是出现在文件中而不是 foo(X-1) 中,所以我想让 sed 只搜索最后一次匹配 fooX 之后的 fileX 部分,这样每个 foo 的搜索空间就会更少。 我一直在尝试使用标签和一些多行方法,但语法在这里一直困扰着我。

有人知道如何让它发挥作用吗? (不一定非要使用 sed,但如果它能在 bash 的基本 shell 中工作那就太好了)

感谢任何帮助。如果您这样做,请解释使用的每个函数/选项/变量,以便我可以找出我搞砸的地方。

bash performance shell sed large-files
1个回答
0
投票

如何使用 awk 生成 sed 脚本,该脚本将在一次运行 sed 中完成所有替换:

awk '{ print "s/" $0 "/" NR "/g" }' foo.list

那么你只需要运行 sed N 次而不是 N^2 次。

© www.soinside.com 2019 - 2024. All rights reserved.