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
Haikel Fazzani
sumber

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
pencuci mulut
sumber
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 ;-).

Stefan
sumber
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