Làm cách nào để chỉ trích xuất các giá trị lớn hơn ngưỡng từ một tệp?


10

Tôi có tập tin này:

names average
john:15.02
Mark:09.63
James:12.58

Tôi muốn chỉ trích xuất trung bình lớn hơn 10 từ nó, vì vậy đầu ra trong ví dụ này phải là:

15.02
12.58

Câu trả lời:


18

Với awk

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

Giải thích

  • -F:- đặt Fdấu phân cách ield thành:
  • {if($2>10)print$2}- đối với mỗi dòng, kiểm tra xem trường 2thứ hai là gì >10, nếu vậy print
  • <filename- hãy để shell mở tệp filename, tốt hơn là để awklàm điều đó, xem câu trả lời của Stéphane Chazelas về chủ đề này

Chạy ví dụ

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

Cũng có thể thêm khoảng trắng và đặt mẫu bên ngoài dấu ngoặc, vì vậy chúng là bằng nhau - cảm ơn Stefan đã chỉ ra rằng:

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

cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn, giải pháp hoàn hảo, tôi chỉ có thể sử dụng các lệnh 'cắt' và 'grep' (các lệnh cơ bản) để hiển thị từ tệp chỉ trung bình cao hơn 10 ..
Haikel Fazzani

Tôi hiểu giải pháp của bạn, hoàn hảo, cảm ơn bạn rất nhiều vì đã giúp đỡ, tôi đánh giá cao tất cả những nỗ lực của bạn ..
Haikel Fazzani

Đừng quên rằng bash sẽ được coi [[ $0 > 10 ]]là một so sánh từ vựng - và trong mọi trường hợp, sẽ không giúp ích nhiều cho các giá trị không nguyên
Steeldo 18/12/17

@dPlay: Cá nhân tôi thích đặt mẫu trước các câu lệnh hành động, ví dụ: awk -F: '$ 2> 10 {print $ 2}', vì nó trông gọn gàng hơn đối với tôi và dễ dàng mở rộng hơn (ví dụ $ 2> 10 && $ 2 <100) .
Stefan

3

Với grep bạn phải làm việc với các biểu thức chính quy; ví dụ

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

như với sed:

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

Nhưng sử dụng RegEx trên dữ liệu theo thứ tự dễ bị lỗi (theo kinh nghiệm của tôi) và khó đọc ;-).


Rất thông minh! Có thể rút ngắn grep ':[1-9][0-9]\+\.' <file | cut -d: -f2sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file. Điều đáng nói là điều này chỉ hoạt động với> 1,> 10,> 100, v.v., ví dụ> 20 là không thể.
tráng miệng

Tôi đã tìm thấy một lỗi trong RegEx của mình: đối với các số không có dấu thập phân thì RegEx phải là: ':[1-9][0-9]\+\.\?'- dấu thập phân bằng chữ \. là tùy chọn và được khớp nhiều nhất một lần \?. (@dPlay cảm ơn vì đã chỉ ra sự hạn chế của RegEx của tôi.)
Stefan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.