web-dev-qa-db-fra.com

AWK pour imprimer le champ $ 2 en premier, puis le champ $ 1

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.

28
Sazzy

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]
57
Chris Seymour

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]
3
glenn jackman

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.

1
parkydr

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.

0
SleepyProgrammer