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
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:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- mengatur F
pemisah ield ke:
{if($2>10)print$2}
- untuk setiap baris, tes apakah 2
bidang nd adalah >10
, jika demikian print
itu<filename
- biarkan shell membuka file filename
, itu lebih baik daripada membiarkannya awk
, lihat jawaban Stéphane Chazelas pada topik tersebut$ <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
[[ $0 > 10 ]]
sebagai perbandingan leksikal - dan bagaimanapun, tidak banyak membantu untuk nilai
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 ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
dan 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.
':[1-9][0-9]\+\.\?'
- titik desimal literal \. opsional dan cocok paling banyak sekali \ ?. (@Derima terima kasih telah menunjukkan batasan RegEx saya.)