
Ich suche nach einer Idee, wie ich einem Feld einen Wert hinzufügen kann. Meine Datei sieht folgendermaßen aus:
line(001)=YR200PR1030,YR230PR1580,YR340PR2016,
YR450PR2450,
PRF3500,
line(002)=YR200PR452,YR230PR740,YR340PR1500,
YR450PR2120,
PRF2800,
und ich möchte jedem Wert zwischen YR und PR einen Wert von 32 hinzufügen, also zB:YR200PR1030
-->YR232PR1030
Irgendeine Idee? Danke.
Antwort1
YR
Wenn Sie den numerischen Wert zwischen jedem Vorkommen von und erhöhen müssen PR
, können Sie Folgendes versuchen:
$ perl -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
YR482PR2450,
PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
YR482PR2120,
PRF2800,
Oder um die Datei direkt zu bearbeiten:
perl -i -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file
Die -pe
Mittel "PDrucken Sie jede Zeile aus, nachdem Sie das durch -e angegebene Skript angewendet haben. Das Skript selbst ist nur ein Ersetzungsoperator ( s/old/new/
) mit dem /g
Flag für „global“ (jedes Vorkommen in der Zeile übereinstimmend) und dem, /e
der es uns ermöglicht, Code auf der rechten Seite des Operators auszuführen. Schließlich gleicht der reguläre Ausdruck eine oder mehrere Ziffern ( \d+
) zwischen a YR
und a PR
ab und erfasst die Ziffern als $1
. Anschließend druckt der Ersatz YR
, die erfasste Zahl plus 32 und PR
.
Antwort2
Verwenden eines beliebigen awk in einer beliebigen Shell auf jeder UNIX-Box:
$ cat tst.awk
{
while ( match($0,/YR[0-9]+PR/) ) {
printf "%s%d", substr($0,1,RSTART+1), substr($0,RSTART+2)+32
$0 = substr($0,RSTART+RLENGTH-2)
}
print
}
.
$ awk -f tst.awk file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
YR482PR2450,
PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
YR482PR2120,
PRF2800,
Antwort3
Befehl
for ((j=1;j<=2;j++)); do awk -v j="$j" -F "," 'NR==j && ORS=","{for(i=1;i<=NF;i++){if ($i ~ /^YR[0-9]*PR[0-9]*/){print substr($i,1,2)substr($i,3,3)+32substr($i,6)}else {print $i}}}' p.txt; echo -e "\n"; done
Ausgabe
YR232PR1030,YR262PR1580,YR372PR2016,YR482PR2450,
YR232PR452,YR262PR740,YR372PR1500,YR482PR2120,PRF2800,