Voici l'entrée (exemple):
[email protected]|com.emailclient.account
[email protected]|com.socialsite.auth.account
J'essaie d'y parvenir:
Emailclient [email protected]
Socialsite [email protected]
Si j'utilise AWK comme ceci:
cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'
il gâche la sortie en superposant le champ 1 en haut du champ 2.
Des conseils/suggestions? Je vous remercie.
Quelques conseils généraux (en plus du numéro de fin de ligne DOS) :
cat
est utilisé pour concaténer des fichiers, ce n'est pas le seul outil capable de lire des fichiers! Si une commande ne lit pas les fichiers, utilisez une redirection telle que command < file
.
Vous pouvez définir le séparateur de champs avec l'option -F
de manière à remplacer:
cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'
Essayer:
awk -F'|' '{print $2" "$1}' foo
Cela produira:
com.emailclient.account [email protected]
com.socialsite.auth.accoun [email protected]
Pour obtenir le résultat souhaité, vous pouvez faire une variété de choses. Je voudrais probablement split()
le deuxième champ:
awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
emailclient [email protected]
socialsite [email protected]
Enfin, convertir le premier caractère en majuscule est un peu pénible dans awk
car vous n’avez pas de fonction Nice construite dans ucfirst()
:
awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file
Emailclient [email protected]
Socialsite [email protected]
Si vous voulez quelque chose de plus concis (bien que vous abandonniez un sous-processus) vous pourriez faire:
awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
Emailclient [email protected]
Socialsite [email protected]
Utilisez un point ou un tuyau comme séparateur de champ:
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
donne:
Emailclient [email protected]
Socialsite [email protected]
Le awk est ok. Je suppose que le fichier provient d'un système Windows et qu'il comporte un CR (^ m ascii 0x0d) à la fin de la ligne.
Cela entraînera le curseur pour aller au début de la ligne après $ 2.
Utilisez dos2unix ou vi avec :se ff=unix
pour vous débarrasser des CR.
Peut-être que votre fichier contient un terminateur CRLF.
Toutes les lignes suivies par\r\n . Awk reconnaissent les $ 2 en fait $ 2\r . Le\r signifie aller au début de la ligne.
{print $ 2\r $ 1} va d'abord imprimer $ 2, puis revenir en tête, puis imprimer $ 1 . Le champ 2 est donc superposé au champ 1.