file teks saya terlihat seperti ini:
Liquid penetration 95% mass (m) = 0.000205348
Liquid penetration 95% mass (m) = 0.000265725
Liquid penetration 95% mass (m) = 0.000322823
Liquid penetration 95% mass (m) = 0.000376445
Liquid penetration 95% mass (m) = 0.000425341
sekarang saya ingin menghapus Liquid penetration 95% mass (m)
dari baris saya untuk mendapatkan nilai saja. Bagaimana saya harus melakukannya?
grep -o '[^[:space:]]\+$' file
\S+$
dengan salah satu-E
atau-P
.) Jadi, solusi semacam ini pada dasarnya tidak lambat. Tapi saya masih belum bisa mendekati metode αғsнιηcut
, yang memenangkan benchmark Anda juga.Jawaban:
Jika hanya ada satu
=
tanda, Anda bisa menghapus semuanya sebelum dan termasuk=
seperti ini:Jika Anda ingin mengubah file asli, gunakan
-i
opsi setelah pengujian:Catatan
-r
gunakan ERE agar kita tidak perlu melarikan diri(
dan)
s/old/new
gantiold
dengannew
.*
sejumlah karakter apa pun(things)
simpanthings
ke backreference kemudian dengan\1
,\2
, dllsumber
s/^.*= //
akan bekerja sama baiknya, karena nilai yang benar adalah di akhir baris.\1
dll memiliki beberapa nilai bagi orang-orang yang dapatkan pertanyaan ini saat mencari, yang tidak memiliki masalah sederhanaIni adalah pekerjaan untuk
awk
; dengan asumsi nilai hanya terjadi di bidang terakhir (sesuai contoh Anda):NF
adalahawk
variabel, memperluas ke jumlah bidang dalam catatan (baris), maka$NF
(perhatikan$
di depan) berisi nilai bidang terakhir.Contoh:
sumber
Saya memutuskan untuk membandingkan berbagai solusi, yang tercantum di sini. Untuk tujuan ini, saya telah membuat file besar, berdasarkan konten yang disediakan oleh OP:
Saya membuat file sederhana, bernama
input.file
:Lalu saya mengeksekusi loop ini:
Jendela terminal diblokir. Saya dieksekusi
killall tee
dari terminal lain. Kemudian saya memeriksa isi file dengan perintah:less input.file
andcat input.file
. Itu terlihat bagus, kecuali baris terakhir. Jadi saya menghapus baris terakhir dan membuat salinan cadangan:cp input.file{,.copy}
(karena perintah yang menggunakan opsi inplace ).Hitungan akhir baris ke dalam file
input.file
adalah 2 192 473 . Saya mendapat nomor itu dengan perintahwc
:Ini adalah hasil perbandingan:
grep -o '[^[:space:]]\+$'
sed -ri 's/.* = (.*)/\1/'
Atau jika kita mengarahkan output ke file baru perintah lebih cepat:
gawk '{gsub(".*= ", "");print}'
rev | cut -d' ' -f1 | rev
grep -oP '.*= \K.*'
sed 's/.*= //'
(masing-masing-i
opsi membuat perintah beberapa kali lebih lambat)perl -pe 's/.*= //'
(-i
opsi tidak menghasilkan perbedaan besar dalam produktivitas di sini)awk '{print $NF}'
cut -c 35-
cut -d= -f2
Sumber ide.
sumber
cut -d= -f2
menang. hahawc -l
menghasilkan tiga angka? Ketika tidak ada opsi lain yang dilewati,-l
opsi harus menekan segalanya kecuali jumlah baris.wc
benar-benar menampilkan ruang-ruang itu? Apakah ada pengaturan lokal yang akan melakukan itu?) Terima kasih atas pembaruannya!wc
sekali lagi. Aku tidak tahu di mana akalku lebih awal hari ini, tapi aku benar-benar tidak bisa memahaminya. Jadi memang spasi adalah pemisah grup digit , danwc
tidak menambahkannya :)Dengan
grep
dan-P
untuk memilikiPCRE
(Menafsirkan pola sebagai P erl- C ompatible R egular E Xpression) dan-o
pola untuk mencetak cocok saja. The\K
memberitahukan akan mengabaikan bagian cocok datang sebelum itu sendiri.Atau Anda bisa menggunakan
cut
perintah sebagai gantinya.sumber
cut
metode dalam jawaban ini juga pemenang dalam patokan kecil aku berlari yang diuji metode yang lebih sedikit tetapi menggunakan file input yang lebih besar. Itu lebih dari sepuluh kali lebih cepat daripada varian cepat dari metode yang saya suka secara pribadi (dan bahwa jawaban saya terutama tentang).Karena awalan garis selalu memiliki panjang yang sama (34 karakter), Anda dapat menggunakan
cut
:sumber
Membalikkan isi file dengan
rev
, menyalurkan outputcut
dengan spasi sebagai pembatas dan 1 sebagai bidang target, lalu balikkan lagi untuk mendapatkan nomor asli:sumber
Ini sederhana, pendek, dan mudah untuk ditulis, dipahami, dan diperiksa, dan saya pribadi menyukainya:
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):
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:
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
dibuatgrep
lebih cepat dengan lebih dari satu urutan besarnya. Jadi untuk file besar, mungkin lebih baik menggunakan perintah ini daripada yang ditunjukkan di atas: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 sepertigrep
yang sering ditawarkan sebagai solusi lini pertama (dan bahwa saya secara pribadi lebih terbiasa dengan untuk menggunakan).sumber
perl
- s mengganti pola/.*= /
dengan string kosong//
:Dari
perl --help
:sed
- gantikan pola dengan string kosong:atau (tetapi lebih lambat dari yang di atas) :
gawk
- gantikan pola".*= "
dengan string kosong""
:Dari
man gawk
:sumber