Saya memiliki file sebagai berikut
200.000 1.353 0.086
200.250 1.417 0.000
200.500 1.359 0.091
200.750 1.423 0.000
201.000 1.365 0.093
201.250 1.427 0.000
201.500 1.373 0.093
201.750 1.432 0.000
202.000 1.383 0.091
202.250 1.435 0.000
202.500 1.392 0.087
202.750 1.436 0.000
203.000 1.402 0.081
203.250 1.437 0.001
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Saya ingin grep hanya baris yang ada di kolom pertama desimal .000 dan .500 saja sehingga hasilnya akan seperti ini
200.000 1.353 0.086
200.500 1.359 0.091
201.000 1.365 0.093
201.500 1.373 0.093
202.000 1.383 0.091
202.500 1.392 0.087
203.000 1.402 0.081
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Jawaban:
Anda tidak menggunakan grep. Gunakan
awk
.sumber
awk '$1 ~ /\.[05]0*$/'
.awk '$1 ~ /\.[05]00$/'
, sendiri (memerlukan tepat tiga digit), kecuali saya punya alasan untuk berpikir bahwa tempat desimal variabel diharapkan dalam input.echo 0.5001 | awk '$1 ~ /\.[05]00/'
. Itu hanya bekerja andal jika ada tepat tiga.Kolom pertama
$1
akan dicocokkan/\.500|\.000/
dengan titik-titik yang dilepaskan menjadi titik-titik literal tidak mengubah karakter apa pun yang~
cocok sebagian, dan mencetak seluruh baris$0
sumber
{ print $0 }
; itu adalah tindakan standar Awk.Pikiran pertamaku
Tes cepat menggunakan WSL
Ada cara yang lebih ringkas untuk mengungkapkan ini.
Jika kolom pertama mungkin memiliki selain bagian integer 3 digit
Dalam beberapa situasi Anda mungkin perlu menggunakan
[:digit:]
di tempat[0-9]
.Dan seterusnya.
man grep
adalah temanmusumber
grep
ini lebih mudah digunakan daripada milik saya. Saya tidak akan memposting jawaban jika saya sudah melihat ini dulu. Pekerjaan yang baik!Tergantung pada kasus penggunaan Anda, Anda mungkin juga menggunakan operasi numerik yang sebenarnya:
Diuji dengan BSD awk (OSX El Capitan, 20070501) dan GNU awk 4.1.4.
sumber
sumber
Dengan
awk
:Dengan
mlr
:sumber
Ok, sedikit terlambat menambahkan kontribusi saya, tapi saya pikir itu sepadan.
Persyaratan untuk memenuhi, per OP adalah kolom pertama yang memiliki nilai desimal
.000
atau.500
hanya. Tidak ada ketentuan tentang nilai utama, baik dengan rentang atau panjang. Untuk ketahanan, tidak boleh dianggap dibatasi oleh apa pun kecuali bahwa tidak ada karakter yang tidak kosong sebelum kolom pertama (atau bukan lagi kolom pertama) dan bahwa isi kolom pertama akan memiliki titik desimal.
,, di suatu tempat.OP ingin menggunakan
grep
, yang akan mencetak seluruh baris ketika kecocokan ditemukan, jadi satu-satunya yang harus dilakukan adalah membuat pola yang cocok dengan semua dan hanya apa yang diperlukan.Kesederhanaan itu sendiri, dan tidak ada alasan untuk menggunakan
sed
atauawk
sebagai `grep dapat menangani sumber sebagai file atau pipa.Untuk
grep
menggunakan filegrep '^[^.]*\.[05]0\{2\}\s' the_file.txt
Untuk
grep
dari pipa, gunakanmy_command | grep '^[^.]*\.[05]0\{2\}\s'
Polanya adalah:,
^
mulai dari awal baris;[^.]
, cocok dengan karakter non-desimal;*
, sebanyak mungkin (termasuk tidak ada);\.
, cocok dengan titik desimal;[05]
, cocok dengan lima atau nol;0\{2\}
, cocokkan 2 angka nol lagi (backslash sebelum brace buka dan tutup mencegah shell mencoba melakukan ekspansi brace);\s
, cocok dengan karakter spasi putih (artinya bagian akhir kolom - untuk digunakan dalam kasus penggunaan yang berbeda, ganti dengan pemisah kolom, biasanya komman, semi-kolon, atau tab\t
).Perhatikan bahwa ini akan cocok persis apa yang OP bertanya. Ini tidak akan cocok
.5000
atau.0000
meskipun setara secara numerik, karena pola mencari lima atau nol, diikuti oleh tepat 2 nol lebih diikuti oleh spasi putih. Jika itu penting, maka semua jawaban lain, sejauh ini, gagal karena mereka akan cocok dengan angka nol, lebih besar dari 1, setelah angka uji. Dan kecuali untuk jawaban oleh FloHimself, mereka akan cocok dengan apa pun di kolom kedua yang dimulai.000
atau.500
, termasuk.0003
dan.500T
, dan yang oleh FloHimself akan cocok dengan apa pun yang secara matematis setara dengan.0
dan.5
, tidak peduli berapa banyak nol yang ada. Yang terakhir, meskipun tidak cocok dengan apa yang dinyatakan OP kemungkinan cocok dengan apa yang OP butuhkan.Akhirnya, jika kekuatan, dan kecepatan,
awk
diinginkan, meskipun OP memintagrep
, maka perintahnya adalah:Dengan sebuah file
awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt
Dengan pipa
my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'
sumber
Jika Anda bersikeras menggunakan grep, maka ini mungkin cocok untuk Anda. Saya menyimpan output pertama yang Anda berikan ke file teks bernama, "file.txt" dan kemudian menggunakan perintah berikut:
grep -e '2[^ ]*.000' file.txt & grep -e '2[^ ]*.500' file.txt
Yang menghasilkan output:
Anda tidak perlu menyimpan output ke file teks jika sudah ada dalam file. Tetapi jika itu tidak disimpan ke file, Anda juga dapat menyalurkan data ke perintah grep yang saya berikan dan itu harus bekerja setidaknya sampai angka pertama
2
,, di kolom pertama tidak lagi a2
. Pada saat itu Anda perlu memperbarui perintah grep dengan karakter yang sesuai untuk mencetak dengan benar.Apa yang terjadi dengan
grep
perintah ganda ini adalah bahwa yang pertamagrep
dikirim ke latar belakang dengan&
operator. Saat dikirim ke latar belakang,grep
perintah berikutnya dijalankan segera setelah itu memberi Anda output yang seragam. Untuk tugas yang Anda perlu selesaikan agar dilakukan dengan lebih mudah, Anda harus mengikuti contoh yang telah diberikan dan digunakan orang lainawk
atau bahkansed
.(edit)
Ini bukan berarti penggunaan grep terbaik atau paling efektif untuk kebutuhan Anda, tetapi itu harus cukup memadai bagi Anda untuk bermain-main sedikit dan mendapatkan rasa yang lebih baik untuk grep.
sumber
.500
dan.000
dari kolom pertama. Jika perlu dalam urutan tertentu, seperti paling tidak sampai terbesar, itu dapat dengan mudah dilakukan. Namun, 3 digit pertama dari kolom pertama yang dicetak setidaknya dalam urutan terbesar. Itu adalah hasil dari2[^ ]*.000
dan2[^ ]*.500
. Cukup pas dengan apa yang diminta OP.