Je sais comment sélectionner un champ dans une ligne à l'aide de la commande de coupe. 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
Résultats:
b
g
l
Ma question: Comment puis-je sélectionner le deuxième champ à compter de la fin? Dans l'exemple précédent, le résultat serait:
d
i
n
Réponses:
Inverser l'entrée avant et après
cut
avecrev
:Sortie:
la source
cut
ne soit pas possible de prendre des index de champs négatifs (comme Python).Essayez de faire ceci avec awk :
Ou en utilisant perl :
Ou en utilisant ruby (merci manatwork):
Ou en utilisant
bash
(merci manatwork):Ou en utilisant python :
la source
bash
il ne faille pas le nombre de colonnes fixe pour cela:while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt
.perl
avecruby
.ruby
ajouté,bash
édité.-
ou (en fonction de l'environnement, du shell ou de la manière dont le shell a été compilé), peut contenir des caractères de barre oblique inverse, ceecho
n'est pas une option. Pourquoi avez-vous besoin decat
consommerfile.txt
sans rien avant de le nourrirpython
!?. Vous avez besoin auread -A
lieu deread -a
dansksh93
etzsh
. Les indices négatifs fonctionnent dans,zsh
mais seulement dans les versions récentes deksh93
etbash
. Dans les anciennes versions, vous pouvez utiliser${d: -2:1}
${d[@]: -2:1}
dans votre dernière phrase.Utilisation de sed:
Sortie:
Explication
([^,]*,)*
correspond à un nombre quelconque de caractères sans virgule suivis d'une virgule, c'est-à-dire un nombre quelconque de colonnes.([^,]*)
correspond à une colonne.(,[^,]*){1}
correspond à une colonne à la fin, si vous modifiez le quantificateur{1}
pour{2}
qu'il corresponde à la deuxième colonne à partir de la fin, etc.la source