echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
comment puis-je faire un "MAGIC" pour obtenir cette sortie?:
three
six
nine
MISE À JOUR: Je n'en ai pas besoin de cette manière spécifique, j'ai besoin d'une solution générale pour que peu importe le nombre de colonnes dans une ligne, par exemple: awk affiche toujours la dernière colonne.
text-processing
awk
LanceBaynes
la source
la source
Réponses:
Il peut même se faire qu'avec
'bash'
, sans'sed'
,'awk'
ou'perl'
:la source
... | while read -r line; do echo ${line##* }; done
bash
l'index du tableau est soumis à une évaluation arithmétique, c'est doncecho ${line[nb - 1]}
suffisant. En parlantbash
, vous pouvez simplement sauter les choses « nb »:echo ${line[-1]}
. Une alternative plus portable du plus tard:echo ${line[@]: -1]}
. (Voir le commentaire de Stéphane Chazelas sur les indices négatifs ailleurs.)Essayer:
la source
ps -ef | awk '{ print $NF }'
avait des lignes tronquées ...) Perl n'a pas cette limitation. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : "Awk traditionnel a une limite de 99 champs dans un enregistrement. Puisque certaines implémentations Awk, comme Tru64, divisent l'entrée même si vous ne faites pas référence à n'importe quel champ du script, pour contourner ce problème, définissez 'FS' sur un caractère inhabituel et utilisez la division. ")awk
implémentations ont cette limitation? Je ne l'ai jamais vu. Mamawk
volonté s'étouffera,32768
mais mongawk
etigawk
pourra faire face à des millions avec bonheur. Même maawk
boîte occupée peut gérer des millions de personnes. Je ne suis jamais tombé sur unawk
qui ne peut pas traiter 100 champs, c'est un tout petit nombre, après tout. Êtes-vous sûr que les informations sont toujours pertinentes? Même sur Solaris?C'est plus facile que vous ne le pensez.
la source
Essayez
grep
(plus court / plus simple, mais 3 fois plus lent qu'enawk
raison de l'utilisation de l'expression régulière):Ou
ex
(encore plus lent, mais il imprime tout le tampon après la fin, plus utile lorsqu'il doit être trié ou modifié sur place):Pour changer sur place, remplacez
-sc'%p|q!'
par-scwq
.Ou
bash
:Performance
Compte tenu du fichier 1 Go généré via:
J'ai effectué les statistiques de temps d'analyse (exécuté ~ 3x et pris le plus bas, testé sur MBP OS X):
utilisant
awk
:utilisant
grep
:utilisant
perl
:en utilisant
rev
+cut
:utilisant
ex
:utilisant
bash
:la source
la source
-a
:, champs autosplit dans le@F
tableau;-l
coupe$/
(séparateur d'enregistrement d'entrée) et l'enregistre dans$\
(séparateur d'enregistrement de sortie). Puisqu'aucun nombre octal n'est fourni avec-l
, l'original$/
est appliqué sur papier (fins de ligne);-n
code de boucle;-e
exécuter le code immédiatement après. Tu voisman perlrun
.Cela peut également être fait en utilisant
'sed'
:Mise à jour:
ou plus simplement:
la source
Ou en utilisant
cut
:même si cela ne satisfait pas à l'exigence de «solution générale». En utilisant
rev
deux fois, nous pouvons également résoudre ce problème:la source
rev
ne fonctionne pas avec les caractères "larges", uniquement ceux à un octet, pour autant que je sache.En utilisant
awk
vous pouvez d'abord vérifier s'il y a au moins une colonne.la source
awk 'NF{print $NF}'
.En perl cela peut se faire comme suit:
sortie:
Vous pouvez également parcourir un fichier en boucle, voici un exemple de script que j'ai écrit pour analyser un fichier appelé budget.dat
exemples de données dans budget.dat:
(vous pouvez voir que je devais capturer uniquement la "dernière" colonne, pas seulement la colonne 2)
Le script:
la source