所以我有几个这样结构的大文件(~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 中工作那就太好了)
感谢任何帮助。如果您这样做,请解释使用的每个函数/选项/变量,以便我可以找出我搞砸的地方。
如何使用 awk 生成 sed 脚本,该脚本将在一次运行 sed 中完成所有替换:
awk '{ print "s/" $0 "/" NR "/g" }' foo.list
那么你只需要运行 sed N 次而不是 N^2 次。