Ini sederhana, pendek, dan mudah untuk ditulis, dipahami, dan diperiksa, dan saya pribadi menyukainya:
grep -oE '\S+$' file
grep
di Ubuntu , ketika dipanggil dengan -E
atau -P
, mengambil singkatan \s
artinya karakter spasi (dalam praktiknya biasanya spasi atau tab) dan \S
berarti apa pun yang bukan. Menggunakan quantifier+
dan anchor end-of-line$
, polanya \S+$
cocok dengan satu atau lebih non-blanko di akhir baris . Anda bisa menggunakannya -P
sebagai ganti -E
; artinya dalam hal ini adalah sama tetapi mesin ekspresi reguler yang berbeda digunakan, sehingga mereka mungkin memiliki karakteristik kinerja yang berbeda .
Ini sama dengan solusi yang dikomentari Avinash Raj (hanya dengan sintaks yang lebih mudah dan lebih ringkas):
grep -o '[^[:space:]]\+$' file
Pendekatan-pendekatan ini tidak akan berhasil jika ada jejak spasi setelah nomor. Mereka dapat dimodifikasi sehingga mereka lakukan, tapi saya tidak melihat ada gunanya masuk ke sini. Meskipun kadang-kadang instruktif untuk menggeneralisasi solusi untuk bekerja di bawah lebih banyak kasus, itu tidak praktis untuk melakukannya sesering orang cenderung berasumsi, karena orang biasanya tidak memiliki cara untuk mengetahui di mana dari banyak cara berbeda yang tidak cocok masalah mungkin pada akhirnya perlu untuk disamaratakan.
Kinerja terkadang menjadi pertimbangan penting. Pertanyaan ini tidak menetapkan bahwa inputnya sangat besar, dan kemungkinan setiap metode yang telah diposting di sini cukup cepat. Namun, jika kecepatan diinginkan, inilah patokan kecil pada file masukan sepuluh juta baris:
$ 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
Saya menjalankannya dua kali untuk berjaga-jaga jika urutannya penting (seperti yang kadang-kadang berlaku untuk tugas I / O-berat) dan karena saya tidak memiliki mesin yang tersedia yang tidak melakukan hal-hal lain di latar belakang yang dapat membelokkan hasilnya. Dari hasil-hasil tersebut saya menyimpulkan yang berikut, setidaknya untuk sementara dan untuk input file dengan ukuran yang saya gunakan:
Wow! Lewat-P
(untuk menggunakan PCRE ) daripada -G
(default ketika tidak ada dialek ditentukan) atau -E
dibuat grep
lebih cepat dengan lebih dari satu urutan besarnya. Jadi untuk file besar, mungkin lebih baik menggunakan perintah ini daripada yang ditunjukkan di atas:
grep -oP '\S+$' file
WOW!! The cut
metode dalam jawaban αғsнιη ini ,adalah lebih urutan besarnya lebih cepat daripada versi lebih cepat dari cara saya! Itu adalah pemenang dalam benchmark pa4080 juga, yang mencakup lebih banyak metode daripada ini tetapi dengan input yang lebih kecil - dan itulah sebabnya saya memilihnya, dari semua metode lain, untuk disertakan dalam pengujian saya. Jika kinerja penting atau file besar, saya pikir metode αғsнιη harus digunakan.cut -d= -f2 file
cut
Ini juga berfungsi sebagai pengingat bahwa utilitas sederhana cut
dan tidak boleh dilupakanpaste
, dan mungkin harus lebih disukai jika berlaku, meskipun ada alat yang lebih canggih seperti grep
yang sering ditawarkan sebagai solusi lini pertama (dan bahwa saya secara pribadi lebih terbiasa dengan untuk menggunakan).
grep -o '[^[:space:]]\+$' file