it-swarm.com.de

AWK, um zuerst Feld $ 2 und dann $ 1 zu drucken

Hier ist die Eingabe (Beispiel):

[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account

Ich versuche das zu erreichen:

Emailclient [email protected]
Socialsite [email protected]

Wenn ich AWK so benutze:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'

die Ausgabe wird durch Überlagern von Feld 1 oben in Feld 2 durcheinander gebracht.

Irgendwelche Tipps/Vorschläge? Vielen Dank.

28
Sazzy

Ein paar allgemeine Tipps (neben der Ausgabe der DOS-Zeile):

cat ist für die Verkettung von Dateien gedacht, es ist nicht das einzige Tool, das Dateien lesen kann! Wenn ein Befehl keine Dateien liest, verwenden Sie die Umleitung wie command < file

Sie können das Feldtrennzeichen mit der Option -F so setzen, anstatt: 

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}' 

Versuchen:

awk -F'|' '{print $2" "$1}' foo 

Dies wird ausgegeben:

com.emailclient.account [email protected]
com.socialsite.auth.accoun [email protected]

Um die gewünschte Ausgabe zu erhalten, können Sie verschiedene Dinge tun. Ich würde wahrscheinlich das zweite Feld split():

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
emailclient [email protected]
socialsite [email protected]

Um das erste Zeichen in Großbuchstaben zu konvertieren, ist es etwas ärgerlich in awk, da Sie nicht über eine in ucfirst() eingebaute Nice-Funktion verfügen:

awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file
Emailclient [email protected]
Socialsite [email protected]

Wenn Sie etwas genaueres wollen (obwohl Sie einen Unterprozess aufgeben), können Sie Folgendes tun:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
Emailclient [email protected]
Socialsite [email protected]
57
Chris Seymour

Verwenden Sie einen Punkt oder eine Pipe als Feldtrennzeichen:

awk -v FS='[.|]' '{
    printf "%s%s %s.%s\n", toupper(substr($4,1,1)), substr($4,2), $1, $2
}' << END
[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account
END

gibt:

Emailclient [email protected]
Socialsite [email protected]
3
glenn jackman

Die Ahnung ist in Ordnung. Ich vermute, die Datei stammt von einem Windows-System und hat am Ende der Zeile eine CR (^ m ascii 0x0d).

Der Cursor springt nach $ 2 an den Zeilenanfang.

Verwenden Sie dos2unix oder vi mit :se ff=unix, um die CRs zu entfernen.

1
parkydr

Möglicherweise enthält Ihre Datei den CRLF-Terminator.

Jede Zeile gefolgt von\r\n . Awk erkennt die $ 2 tatsächlich $ 2\r . Das\r bedeutet, dass der Zeilenanfang beginnt.

{print $ 2\r $ 1} druckt zuerst $ 2, kehrt dann zum Kopf zurück und druckt dann $ 1 . Das Feld 2 wird also von Feld 1 überlagert.

0