Bagaimana cara mengekstrak hanya nilai yang lebih besar dari ambang batas dari file?


10

Saya punya file ini:

names average
john:15.02
Mark:09.63
James:12.58

Saya ingin mengekstraksi hanya rata-rata lebih besar dari 10, jadi output dalam contoh ini harus:

15.02
12.58

Jawaban:


18

Dengan awk

awk -F: '{if($2>10)print$2}' <filename

Penjelasan

  • -F:- mengatur Fpemisah ield ke:
  • {if($2>10)print$2}- untuk setiap baris, tes apakah 2bidang nd adalah >10, jika demikian printitu
  • <filename- biarkan shell membuka file filename, itu lebih baik daripada membiarkannya awk, lihat jawaban Stéphane Chazelas pada topik tersebut

Contoh dijalankan

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

Dimungkinkan juga untuk menambahkan spasi dan meletakkan pola di luar tanda kurung, jadi ini sama - terima kasih kepada Stefan karena menunjukkan hal itu:

awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename

terima kasih banyak atas bantuan Anda, solusi sempurna, dapatkah saya menggunakan hanya perintah 'cut' dan 'grep' (perintah dasar) dalam situasi ini untuk menampilkan dari rata-rata file saja lebih unggul dari 10 ..
— Haikel Fazzani

saya mengerti solusi Anda, sempurna, terima kasih banyak atas bantuannya, saya menghargai semua upaya Anda ..
— Haikel Fazzani

Jangan lupa bahwa bash akan diperlakukan [[ $0 > 10 ]]sebagai perbandingan leksikal - dan bagaimanapun, tidak banyak membantu untuk nilai
— steeldriver

@dessert: Saya pribadi lebih suka meletakkan pola sebelum pernyataan tindakan mis .: awk -F: '$ 2> 10 {print $ 2}', karena terlihat lebih rapi untuk saya dan lebih mudah untuk diperpanjang (mis. $ 2> 10 && $ 2 <100) .
— Stefan

3

Dengan grep Anda harus bekerja dengan ekspresi reguler; misalnya

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

seperti dengan sed:

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

Tetapi menggunakan RegEx pada data yang dipesan rentan kesalahan (dalam pengalaman saya) dan sulit dibaca ;-).


Sangat pintar! Dapat disingkat menjadi grep ':[1-9][0-9]\+\.' <file | cut -d: -f2dan sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Perlu disebutkan bahwa ini hanya bekerja dengan> 1,> 10,> 100 dll., Mis.> 20 tidak mungkin.
— hidangan penutup

Saya telah menemukan bug di RegEx saya: untuk angka tanpa titik desimal RegEx harus: ':[1-9][0-9]\+\.\?'- titik desimal literal \. opsional dan cocok paling banyak sekali \ ?. (@Derima terima kasih telah menunjukkan batasan RegEx saya.)
— Stefan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.