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
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:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
- đặt F
dấ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 2
thứ hai là gì >10
, nếu vậy print
nó<filename
- hãy để shell mở tệp filename
, tốt hơn là để awk
làm điều đó, xem câu trả lời của Stéphane Chazelas về chủ đề này$ <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
[[ $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
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 ;-).
grep ':[1-9][0-9]\+\.' <file | cut -d: -f2
và sed -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ể.
':[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.)