2017-04-09 2 views
4

Ich habe einen einfachen awk Befehl, der ein Datum von MM/TT/JJJJ in JJJJ/MM/TT umwandelt. Die Datei, die ich benutze, hat jedoch \ r \ n am Ende der Zeilen, und manchmal ist das Datum am Ende der Zeile.Entfernen r n in awk

awk ' 
    BEGIN { FS = OFS = "|" } 
    { 
    split($27, date, /\//) 
    $27 = date[3] "/" date[1] "/" date[2] 

    print $0 
    } 
' file.txt 

In diesem Fall, wenn das Datum ist MM/DD/YYYY\r\n dann ich mit diesem in der Ausgabe am Ende:

YYYY 
/MM/DD 

Was ist der beste Weg, dies zu umgehen? Denken Sie daran, manchmal die Eingabe einfach \r\n in welchem ​​Fall der Ausgang // sein sollte, sondern endet als

/ 
/
+0

Warum benutzt du nicht eine der Ersatzfunktionen auf 'date [3]', um '\ r' durch '' '' zu ersetzen? –

Antwort

6

Da die \r am Ende des Feldes ist nicht immer $27, ist der einfachste Ansatz zu Entfernen Sie die \r aus der gesamten Zeile.

Mit GNU Awk oder Mawk (einer davon ist in der Regel der Standard awk auf Linux-Plattformen), können Sie einfach definieren Sie Ihre Eingabe voneinander zu trennen ist, RS dementsprechend:

awk -v RS='\r\n' ... 

Oder, wenn Sie wollen \r\nAusgang Linien zu terminierten, stellen Sie den Ausgang voneinander zu trennen sind, ORS, auf den gleichen Wert:

awk 'BEGIN { RS=ORS="\r\n"; ... 

Optional Lesung: Nebenbei bemerkt für BSD/macOS Awk Benutzer:

BSD/macOS awk nicht Multi-CharakterRS Werte (entsprechend unterstützt mit dem POSIX Awk spec: „Wenn RS enthält mehr als ein Zeichen, die Ergebnisse sind nicht spezifiziert ").

Daher wird ein Anruf innerhalb des sub Awk Skript ist erforderlich, die Instanz von \r Ende jeder Eingangsleitung zu trimmen:

awk '{ sub("\r$", ""); ... 

auch Ausgang\r\n -terminierten Linien, Option -v ORS='\r\n' (oder ORS="\r\n" innerhalb des Skripts BEGIN Block) wird gut funktionieren, wie mit GNU Awk und Mawk.

+1

Perfekt. Vielen Dank! – richie

0

Wenn Sie sich auf einem System befinden, auf dem \n für sich allein der Newline ist, sollten Sie die \r aus dem Datensatz entfernen. Du könntest es mögen:

$ awk '{sub(/\r/,"",$NF); ...}'