Questo è semplice, breve e facile da scrivere, capire e controllare, e personalmente mi piace:
grep -oE '\S+$' file
grep
in Ubuntu , quando viene invocato con -E
o -P
, prende la scorciatoia \s
per indicare un carattere di spazi bianchi (in pratica di solito uno spazio o una scheda) e \S
per indicare qualsiasi cosa che non sia uno. Usando il quantificatore+
e l'ancoraggio di fine linea$
, il modello \S+$
abbina uno o più spazi non bianchi alla fine di una linea . Puoi usare -P
invece di -E
; il significato in questo caso è lo stesso ma viene utilizzato un motore di espressioni regolari diverso , quindi possono avere caratteristiche prestazionali diverse .
Ciò equivale alla soluzione commentata di Avinash Raj (solo con una sintassi più semplice e compatta):
grep -o '[^[:space:]]\+$' file
Questi approcci non funzioneranno se dopo il numero potrebbero esserci spazi vuoti finali . Possono essere modificati così come fanno, ma non vedo alcun motivo di approfondire qui. Anche se a volte è istruttivo generalizzare una soluzione per lavorare in più casi, non è pratico farlo quasi tutte le volte che le persone tendono ad assumere, perché di solito non si ha modo di sapere in quali modi diversi incompatibili il problema potrebbe in definitiva avere bisogno essere generalizzato.
Le prestazioni sono a volte una considerazione importante. Questa domanda non stabilisce che l'input sia molto grande ed è probabile che ogni metodo che è stato pubblicato qui sia abbastanza veloce. Tuttavia, se si desidera la velocità, ecco un piccolo benchmark su un file di input di dieci milioni di righe:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
L'ho eseguito due volte nel caso in cui l'ordine fosse importante (come talvolta accade per le attività pesanti di I / O) e perché non avevo una macchina disponibile che non facesse altre cose in background che potrebbero distorcere i risultati. Da questi risultati, concludo quanto segue, almeno provvisoriamente e per i file di input delle dimensioni che ho usato:
Wow! Passaggio -P
(per usare PCRE ) piuttosto che -G
(impostazione predefinita quando non viene specificato alcun dialetto) o -E
reso grep
più veloce di un ordine di grandezza. Quindi, per file di grandi dimensioni, potrebbe essere meglio usare questo comando rispetto a quello mostrato sopra:
grep -oP '\S+$' file
WOW!! Il cut
metodo nella risposta di αғsнιη , , è di oltre un ordine di grandezza più veloce rispetto anche la versione più veloce del mio modo! È stato anche il vincitore del benchmark di pa4080 , che ha coperto più metodi di questo ma con input più piccoli - ed è per questo che l'ho scelto, tra tutti gli altri metodi, da includere nel mio test. Se le prestazioni sono importanti o i file sono enormi, penso che dovrebbe essere usato il metodo αғsнιη .cut -d= -f2 file
cut
Questo serve anche a ricordare che la semplicità cut
e le paste
utilità non dovrebbero essere dimenticate e forse dovrebbero essere preferite quando applicabili, anche se ci sono strumenti più sofisticati come grep
quelli spesso offerti come soluzioni di prima linea (e che io sono personalmente più abituato all'utilizzo).
grep -o '[^[:space:]]\+$' file