Comment obtenir l'avant-dernier champ d'une commande cut

j'ai un ensemble de données en entrée et j'ai besoin du deuxième dernier champ basé sur deleimiter. Les lignes peuvent avoir différents nombres de délimiteur. Comment puis-je obtenir la dernière seconde ?

exemple d'entrée

text,blah,blaah,foo
this,is,another,text,line

résultats escomptés

blaah
text
40
demandé sur Chris Seymour 2013-07-15 01:32:21

6 réponses

a obtenu un indice de Unix coupé sauf deux derniers jetons et capable de comprendre la réponse:

cat datafile | rev | cut -d '/' -f 2 | rev
72
répondu Archit Jain 2017-05-23 11:46:52

Awk est bien adapté pour cela:

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

la variable NF est une variable awk spéciale qui contient le nombre de champs dans l'enregistrement courant.

39
répondu Chris Seymour 2013-07-14 21:45:12

il n'est pas nécessaire d'utiliser cut , rev , ou tout autre outil extérieur à bash ici. Viens de lire chaque ligne dans un tableau, et de choisir la pièce que vous voulez:

while IFS=, read -r -a entries; do
  printf '%s\n' "${entries[${#entries[@]} - 2]}"
done <file

le fait de faire cela en bash pur est beaucoup plus rapide que le démarrage d'un pipeline, au moins pour des entrées raisonnablement petites. Pour les entrées importantes, le meilleur outil est awk.

6
répondu Charles Duffy 2013-07-15 03:54:34

Code pour GNU :

$ echo text,blah,blaah,foo|sed -r 's/^(\S+,){2}(\S+),.*//'
blaah

$ echo this,is,another,text,line|sed -r 's/^(\S+,){2}(\S+),.*//'
text

exemple de Code similaire à celui de sudo_O awk code :

$ sed -r 's/.*,(\w+),\w+$//' file
blaah
text

il serait peut-être préférable d'utiliser des programmes plus spécialisés pour les fichiers CSV , par exemple: ou .

2
répondu captcha 2017-05-23 12:34:08

solution Perl similaire à la solution awk de @iiSeymour

perl -lane 'print $F[-2]' file

ces options de ligne de commande sont utilisées:

  • n boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement chaque ligne

  • l "enlève les nouvelles lignes avant le traitement, et les ajoute de nouveau dans la suite

  • a mode autosplit-séparez les lignes d'entrée dans le tableau @F. Par défaut à se séparer sur les espaces

  • e exécutez le code perl

le tableau autosplit @F commence à l'index [0] alors que les champs awk commencent avec $1

-1 est le dernier élément

-2 est le deuxième avant le dernier élément

2
répondu Chris Koknat 2015-09-16 16:02:16

la réponse la plus minimaliste à ce problème est d'utiliser mon cuts utilité:

$ cat file.txt
text,blah,blaah,foo
this,is,another,text,line

$ cuts -2 file.txt
blaah
text

coupe , qui signifie "coupe sur stéroïdes":

- automatically figures out the input field separators
- supports multi-char (and regexp) separators
- automatically pastes (side-by-side) multiple columns from multiple files
- supports negative offsets (from end of line)
- has good defaults to save typing + allows the user to override them

et bien plus encore.

j'ai écrit cuts après avoir été frustré par les trop nombreuses limitations de cut sur Unix. Il est conçu pour remplacer diverses colonnes combos cut / paste plusieurs fichiers, avec des variations de séparateurs multiples, tout en imposant une Dactylographie minimale de l'utilisateur.

vous pouvez obtenir cuts (logiciel libre, Licence artistique) de github: https://github.com/arielf/cuts /

appelant cuts sans arguments affichera un message détaillé Usage .

1
répondu arielf 2014-07-03 00:34:37