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.
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]
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]
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.
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.