awk-Druckbefehl mit der Bedingung NR > var

awk-Druckbefehl mit der Bedingung NR > var

Ich versuche, awkeinige txt-Dateien mit diesem Code zu ändern

awk -F":" '/^title/ { o=FNR+2 } ;FNR>o { print sprintf("%-10s %-10d %-10s",FILENAME,o,$0) }' r.txt

aber es hat nicht funktioniert, bis ich die Bedingung wie folgt ersetzt habe FNR>5.

Ich habe hier also viel versucht, aber keine Lösung gefunden. Ich habe "FNR>o"& eingegeben FNR>$o, aber nichts.

Also Leute, kann mir hier jemand helfen! Eingabe:

date: 22.01.2020
name : xrgsm02
title : RCV20
----------------
----------------
15   20
30   40
50   12
55   77

Ausgabe

r.txt   5  15   20
r.txt   5  30   40
r.txt   5  50   12
r.txt   5  55   77

Antwort1

Das Problem:

FNR>o
  • Verwenden des >Operators mit einem nicht initialisierten Wert
    • Solange oes nicht initialisiert ist, hat es einen numerischen Wert von 0und einen Stringwert von der leeren Zeichenfolge
    • In Ihrem Skript owird mit gesetzt , erscheint /^title/ { o=FNR+2 }aber erst im dritten Datensatz. Für die ersten beiden Datensätze ist es also nicht initialisiert und wird als ausgewertet (weil & sind )/^title/oFNR>otrueFNR==1FNR==2greater than zero

Mögliche Lösung:

o && FNR>o
  • Geben Sie an, dass oes ungleich Null sein muss, zusätzlich zuFNR>o

Außerdem oist es etwas verwirrend, da es sich um einen einbuchstabigen Variablennamen handelt. Verwenden Sie stattdessen lieber einen Buchstaben wie noder ein aussagekräftigeres Wort wieoutput


print sprintf("%-10s %-10d %-10s",FILENAME,o,$0)

könnte vereinfacht werden zu:

printf("%-10s %-10d %-10s\n",FILENAME,o,$0)

oder auch:

printf "%-10s %-10d %-10s\n",FILENAME,o,$0

verwandte Informationen