我有这个文件:
names average
john:15.02
Mark:09.63
James:12.58
我只想从中提取大于 10 的平均值,因此此示例中的输出应该是:
15.02
12.58
答案1
和awk
awk -F: '{if($2>10)print$2}' <filename
解释
-F:
– 将F
字段分隔符设置为:
{if($2>10)print$2}
– 对于每一行,测试2
nd 字段是否为>10
,如果是,print
则<filename
– 让 shell 打开文件filename
,这比让awk
这样做要好,见Stéphane Chazelas 对这个话题的回答
示例运行
$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58
也可以添加空格并将模式放在括号外面,这样它们就相等了——这要归功于斯蒂芬指出这一点:
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
答案2
使用 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 容易出错(根据我的经验)并且难以阅读 ;-)。
答案3
我也发布了这个解决方案
sed '1d' File|cut -d: -f2 |awk '$0>10'
sed '1d'
= 删除标题
cut -d: -f2
= 保留分隔符后的值(在本例中为:)
awk '$0>10'
= 打印所有大于 10 的值