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
  1. 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
  2. C  21 20 19 28
复制代码

作者: Buring__    时间: 2014-11-14 15:49
本帖最后由 Buring__ 于 2014-11-14 15:50 编辑

回复 1# xunong
  1. 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大神的
  1. 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
  2. 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

目测是这样,未测试~~~
  1. 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


    上面的代码不对,应该是这样
  1. 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