Awk-Befehl zum Ersetzen einer Teilzeichenfolge durch einen bestimmten Wert

Awk-Befehl zum Ersetzen einer Teilzeichenfolge durch einen bestimmten Wert

Ich habe eine Flatfile mit einer Telefonnummer im Feld von Position 314 bis 323. Jetzt wollte ich dieses Feld mit ausblenden 1234567890.

Dazu habe ich versucht, die folgenden Befehle zu verwenden und beide verursachen einen Fehler:

awk '{var=substr($0,314,10);gsub("[0-9]","1234567890",$var); print}' final_phone.txt >final_phone.txt1

fatal: grow_fields_arr: fields_arr: 9849885432 Byte Speicher können nicht zugewiesen werden (Speicher kann nicht zugewiesen werden)

Im zweiten Fall

awk 'var=substr($0,314,10) { var = "1234567890" }1' final_phone.txt >final_phone.txt1

Dies funktionierte, aber die Werte änderten sich nicht. Die Ausgabe blieb gleich.

Kann mir hier jemand mit der Syntax helfen?

Im ersten Fall habe ich versucht, die Teilzeichenfolge einer Variablen zuzuweisen, und gsub()wollte nach einem Zahlenmuster suchen und dieses durch ersetzen 1234567890.

kann mir jemand dabei helfen

Antwort1

Sie müssen zwei Teilzeichenfolgen drucken, einen Teil vor dieser Position und einen anderen Teil nach dieser Position, etwa so:

$ awk -v dummy='0123456789' -v start=314 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' infile >outfile

testen:

$ awk -v dummy='0123456789' -v start=4 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' <<<'0009876543210999'
0000123456789999

Problem mit Ihrem Befehl:

  1. Sie verwenden $vares stattdessen varim dritten Argument für gsub(), da dies dazu führt, dass gsub() nach einem Feld sucht, dessen Nummer der Wert einer var10-stelligen Feldnummer ist. Daher versucht awk, gsub() für dieses Feld #xxxxxxxxxx auszuführen, aber dies schlägt aufgrund der Speicherzuweisung für die Neuauswertung dieser sehr großen Anzahl von Feldern fehl (weil $0awk bei Verwendung eines anderen Felds als im dritten Argument für gsub() gezwungen wird, die Felder wieder auf dem Standard-OFS neu aufzubauen).

  2. Wenn wir Problem Nr. 1 beheben, ersetzen Sie jede einzelne Ziffer in der varVariable durch 1234567890eine Zeichenfolge.

  3. Wenn Sie es dann verwenden, printwird die aktuelle Zeile ohne Änderungen gedruckt, da Sie dort keine Aktualisierungen durchführen.

Antwort2

sedSie können stattdessen Folgendes verwenden awk, was weniger ausführlich ist:

$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890

Antwort3

Sie könnten Perl statt awk verwenden. zB

perl -p -e 'substr($_,313,10) = "1234567890"' final_phone.txt >final_phone.txt1

HINWEIS: In der Perl- substrFunktion beginnen die Offsets bei 0 statt bei 1 – daher ist Offset 313 das 314. Zeichen. perldoc -f substrWeitere Einzelheiten finden Sie hier.

verwandte Informationen