web-dev-qa-db-fra.com

Comment couper (sélectionner) un champ à partir de la fin de la ligne de texte?

Je sais comment sélectionner un champ d'une ligne en utilisant la commande cut. Par exemple, compte tenu des données suivantes:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

Cette commande:

cut -d, -f2 # returns the second field of the input line

Retour:

b
g
l

Ma question: comment puis-je sélectionner le deuxième champ en comptant à la fin? Dans l'exemple précédent, le résultat serait:

d
i
n
37
ssn

Inversez l'entrée avant et après cut avec rev:

<infile rev | cut -d, -f2 | rev

Production:

d
i
n
54
Thor

Essayez de le faire avec awk :

awk -F, '{print $(NF-1)}' file.txt

Ou en utilisant Perl :

Perl -F, -lane 'print $F[-2]' file.txt

Ou en utilisant Ruby (merci manatwork):

Ruby -F, -lane 'print $F[-2]' file.txt

Ou en utilisant bash (merci manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

Ou en utilisant python :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'
13
Gilles Quenot

Utilisation de sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

Production:

d
i
n

Explication

  • ([^,]*,)* correspond à n'importe quel nombre de caractères non virgule suivi d'une virgule, c'est-à-dire à n'importe quel nombre de colonnes.
  • ([^,]*) correspond à une colonne.
  • (,[^,]*){1} correspond à une colonne à la fin, si vous modifiez le quantificateur {1} à {2} il correspond à la deuxième colonne de la fin, etc.
0
Thor