2017-11-17 2 views
0

Ich habe eine sehr große (~ 60MB) Textdatei, in der ich spezifische Block Zeilen mit einem vordefinierten Text ersetzen möchte. Die Zeilennummer jeden Block (3 Zeilen) Start ist bekannt, und sie werden in einer Datei gespeichert:Verwenden Sie sed/awk, um Text in mehreren Zeilen auf einmal zu ersetzen

... 
11 
30 
42 
58 
... 

Ich weiß, dass ich die folgende Option, um einen Block ersetzen kann:

sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt 

jedoch wie für Schleife in einer Ausführung dieses Befehls:

for line in $(cat linenumbers.txt); do 
    eline=$((${line}+3)) 
    sed -i "Xs,(X+3)s/.*/REPLACEMENT/" filename.txt 
done 

ist sehr langsam und braucht viel Zeit (> 10'), und ich habe 100s von Dateien, in denen ich Blöcke zu ersetzen. Gibt es eine andere Möglichkeit, dies in einem Durchgang zu tun?

+1

pos das aktuelle und testbare Fragment Ihrer Eingabedatei vor und nach dem Austausch – RomanPerekhrest

Antwort

1

awk zur Rettung!

$ awk 'NR==FNR  {start[$1]; next} 
     FNR in start {c=3} 
     c&&c--  {print "replacement"; next}1' indices file 

dies ist ein ein Durchgang Prozess, können Sie die Ausgabe in eine neue Datei speichern und das Original überschreiben, wenn Sie wollen.

+1

ja, richtig thx. Fest. – karakfa

0

ähnlich @karakfas beantworten, aber eine andere Interpretation der Anforderungen (Hinweis: Ein aktuelles Beispiel mit Eingang und Ausgang würde die Verwirrung hat aufgeklärt):

awk ' 
    NR==FNR  { start[$1]; next } 
    FNR in start { print "replacement"; c=3 } 
    c&&c--  { next } 
    { print } 
' indices file 
0

Dies könnte für Sie arbeitet (GNU sed) :

Konvertieren Sie die Zeile-Nummer-Datei in ein Sed-Skript und führen Sie es gegen die Datendatei.

Verwandte Themen