如何仅从文件中提取大于阈值的值?


Answers:


19

awk

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

说明

  • -F:–将F字段分隔符设置为:
  • {if($2>10)print$2}–对于每一行,测试2nd字段是否为>10,如果print
  • <filename–让shell打开文件filename,这比让它打开更好awk,请参阅StéphaneChazelas关于该主题的答案

运行示例

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

也可以添加空格并将样式放在方括号之外,因此它们是相等的–感谢Stefan指出:

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

非常感谢你的帮助,完美的解决方案,我可以在这种情况下,仅使用命令“剪切”和“grep的”(基本命令),以显示从文件只高于10均线..
Haikel Fazzani

我了解您的解决方案,非常完美,非常感谢您的帮助,我感谢您的所有努力..
Haikel Fazzani

不要忘记bash将被[[ $0 > 10 ]]视为词汇比较-无论如何,对于非整数值来说,它并没有多大帮助
steeldriver

@dessert:我个人更喜欢将模式放在动作语句之前,例如:awk -F:'$ 2> 10 {print $ 2}',因为它看起来更整洁并且易于扩展(例如$ 2> 10 && $ 2 <100) 。
Stefan's

3

使用grep,您将不得不使用正则表达式。例如

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

与sed一样:

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

但是(根据我的经验)对有序数据使用RegEx容易出错,并且难以阅读;-)。


非常聪明!可以缩短为grep ':[1-9][0-9]\+\.' <file | cut -d: -f2sed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file。值得一提的是,这仅适用于> 1,> 10,> 100等。例如,不可能使用> 20。
甜点,

我在RegEx中发现了一个错误:对于没有小数点的数字,RegEx必须为:':[1-9][0-9]\+\.\?'-文字小数点\。是可选的,最多匹配一次\?。(@dessert感谢您指出我的RegEx的限制。)
Stefan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.