Chinaunix
标题:
awk 文本中所有数字除以相同的数 并筛选出符合条件的行
[打印本页]
作者:
xunong
时间:
2014-11-14 15:20
标题:
awk 文本中所有数字除以相同的数 并筛选出符合条件的行
本帖最后由 xunong 于 2014-11-14 16:46 编辑
文件
ID a b c d
A 1 0 10 15
B 22 9 1 0
C 21 20 19 28
...
现在给所有数除以10,得到结果后,再按照同时满足a列>2 来筛选
b >1
c >1
d >2
最后应该只剩下C行(显示除以10之后的数)
求大神帮忙!
作者:
ntwarren
时间:
2014-11-14 15:33
awk '{if($1/10>2 && $2/10>1 && $3/10>1 && $4/10>2){print $0}}' file
作者:
Herowinter
时间:
2014-11-14 15:48
回复
1#
xunong
awk 'BEGIN{a[2]=a[5]=20;a[3]=a[4]=10} NR>1{k=1;for(i=2;i<=NF;i++)k=k&&($i>a[i])}k' i
C 21 20 19 28
复制代码
作者:
Buring__
时间:
2014-11-14 15:49
本帖最后由 Buring__ 于 2014-11-14 15:50 编辑
回复
1#
xunong
awk 'NR>1{for(i=1;i++<NF;)$i=$i/10}$1>2&&$3>1&&$4>1&&$5>2' urfile
复制代码
貌似理解错了
作者:
jason680
时间:
2014-11-14 15:53
回复
1#
xunong
>> 现在给所有数除以10,得到结果后,...
>> ...满足a列>2 , b>1, c >1, d >2
>> 最后应该只剩下C行
a列>20, b列>10, c列>10, d列>20
$ awk '
$2>20 && $3>10 && $4>10 && $5>20
&& NR>1' FILE
C 21 20 19 28
作者:
jason680
时间:
2014-11-14 16:09
本帖最后由 jason680 于 2014-11-14 16:14 编辑
回复
3#
Herowinter
combine your idea ...
$ awk -vd="
10 2 1 1 2
" 'BEGIN{split(d,a," ")}{for(n=2;n<=NF;n++)if($n/a[1]<=a[n])next}1' FILE
C 21 20 19 28
作者:
xunong
时间:
2014-11-14 16:47
貌似 问题写错了 刚改正 最后输出应该是C 2.1 2.0 1.9 2.8
作者:
Herowinter
时间:
2014-11-14 17:23
回复
6#
jason680
thanks, much better now.
作者:
Herowinter
时间:
2014-11-14 17:30
回复
7#
xunong
借用楼上Jason大神的
awk -vd="10 2 1 1 2" 'BEGIN{split(d,a," ")}{for(n=2;n<=NF;n++)if($n/a[1]<=a[n])next;else $n=sprintf("%.1f",$n/10)}1' i
C 2.1 2.0 1.9 2.8
复制代码
作者:
xunong
时间:
2014-11-14 20:16
回复
9#
Herowinter
非常感谢!
又想到一个问题,如果给4列数分别除以不同的数eg:9,10,10,11,而不是统一除以10
该怎么办呢?
作者:
xunong
时间:
2014-11-14 20:19
xunong 发表于 2014-11-14 20:16
回复 9# Herowinter
非常感谢!
又想到一个问题,如果给4列数分别除以不同的数eg:9,10,10,11,而不是 ...
并且得到的小数保留小数点后两位数
作者:
Herowinter
时间:
2014-11-14 20:24
回复
11#
xunong
目测是这样,未测试~~~
awk -vd="10 2 1 1 2" -vl="9 10 10 11" 'BEGIN{split(d,a," ");split(l,b," ")}{for(n=2;n<=NF;n++)if($n/a[1]<=a[n])next;else $n=sprintf("%.2f",$n/b[n-1])}1' i
复制代码
作者:
xunong
时间:
2014-11-14 20:32
回复
12#
Herowinter
运行成功!非常感谢!
另外问下 -vd="10 2 1 1 2"里的数字10表示什么意思呢?因为后面-vl="9 10 10 11"已经有相应的除数了
作者:
Herowinter
时间:
2014-11-14 20:52
回复
13#
xunong
上面的代码不对,应该是这样
awk -vd="2 1 1 2" -vl="9 10 10 11" 'BEGIN{split(d,a," ");split(l,b," ")}{for(n=2;n<=NF;n++)if($n/b[n-1]<=a[n-1])next;else $n=sprintf("%.2f",$n/b[n-1])}1' i
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2