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
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
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.
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.
Code pour GNU sed :
$ 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: awk ou excel .
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
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
.