我有一个非常大(~60MB)的文本文件,我希望用预定义的文本替换特定的块行。每个块(3行)开始的行号是已知的,它们存储在文件中:
sort -r -t\; -k1,1 -k3 file | uniq -w1 | grep "B" | cut -f2 -d\;
我知道我可以使用以下选项来替换块:
...
11
30
42
58
...
但是,在for循环中执行此命令,如:
sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt
非常慢并且需要花费大量时间(> 10')并且我有100个文件,其中我必须替换块。 有没有其他方法可以指示sed一次性完成这项工作?
答案 0 :(得分:1)
awk
救援!
$ awk 'NR==FNR {start[$1]; next}
FNR in start {c=3}
c&&c-- {print "replacement"; next}1' indices file
这是一次性过程,您可以将输出保存到新文件中,并根据需要覆盖原始文件。
答案 1 :(得分:0)
类似于@karakfas的答案,但对您的要求有不同的解释(提示:输入和输出的实际示例可以消除混淆):
awk '
NR==FNR { start[$1]; next }
FNR in start { print "replacement"; c=3 }
c&&c-- { next }
{ print }
' indices file
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 's/.*/&,+3cREPLACEMENT/' lineNumbersFile | sed -f - file
将行号文件转换为sed脚本并对数据文件运行。