99 votes

Comment obtenir le dernier mot de chaque ligne avec bash ?

Par exemple, j'ai un fichier :

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

et j'en ai besoin :

example, line, file

j'ai l'intention avec "awk" mais le problème est que les mots sont dans un espace différent

104voto

Fredrik Pihl Points 20944

Essayez

$ awk 'NF>1{print $NF}' file
example.
line.
file.

Pour obtenir le résultat en une seule ligne comme dans votre exemple, essayez :

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

sortie :

$ awk -f script.awk file
example, line, file, 

C'est du pur délit :

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.

93voto

rici Points 45980

Vous pouvez le faire facilement avec grep :

grep -oE '[^ ]+$' file

( -E utiliser une regex étendue ; -o afficher uniquement le texte correspondant au lieu de la ligne complète)

44voto

Hal Canary Points 811

Vous pouvez faire quelque chose comme ça en awk :

awk '{ print $NF }'

Edit : Pour éviter une ligne vide :

awk 'NF{ print $NF }'

18voto

higuaro Points 7796

Une autre façon de faire cela en bash est d'utiliser la fonction rev comme ceci :

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

En gros, vous inversez les lignes du fichier, puis les divisez avec cut en utilisant l'espace comme délimiteur, prenez le premier champ qui cut produit et ensuite vous inversez le jeton à nouveau, utilisez tr -d pour supprimer les caractères non désirés et tr à nouveau pour remplacer les caractères de nouvelle ligne par ,

De plus, vous pouvez éviter le premier chat en faisant :

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

9voto

rubicks Points 2247

Tldr ;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

Pour un fichier comme celui-ci

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

la commande donnée imprimera

fox, over, dog.

Comment cela fonctionne :

  • awk '{print $NF}' : imprime le dernier champ de chaque ligne
  • paste -sd, : lit stdin en série ( -s un fichier à la fois) et écrit les champs séparés par des virgules ( -d, )
  • sed 's/,/, /g' : s ubstituts "," con ", " g lobalement (pour toutes les instances)

Références :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X