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:
Sie verwenden
$var
es stattdessenvar
im dritten Argument für gsub(), da dies dazu führt, dass gsub() nach einem Feld sucht, dessen Nummer der Wert einervar
10-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$0
awk bei Verwendung eines anderen Felds als im dritten Argument für gsub() gezwungen wird, die Felder wieder auf dem Standard-OFS neu aufzubauen).Wenn wir Problem Nr. 1 beheben, ersetzen Sie jede einzelne Ziffer in der
var
Variable durch1234567890
eine Zeichenfolge.Wenn Sie es dann verwenden,
print
wird die aktuelle Zeile ohne Änderungen gedruckt, da Sie dort keine Aktualisierungen durchführen.
Antwort2
sed
Sie 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- substr
Funktion beginnen die Offsets bei 0 statt bei 1 – daher ist Offset 313 das 314. Zeichen. perldoc -f substr
Weitere Einzelheiten finden Sie hier.