awk fügt einem Feld einen Wert hinzu

awk fügt einem Feld einen Wert hinzu

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

YRWenn 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 -peMittel "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 /gFlag für „global“ (jedes Vorkommen in der Zeile übereinstimmend) und dem, /eder 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 YRund a PRab 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,

verwandte Informationen