Chinaunix

标题: shell如何按条件提取文本 [打印本页]

作者: wzltian    时间: 2014-06-06 12:24
标题: shell如何按条件提取文本
查询出第6列等于163bai,按第三列去重,然后比较第二列,取第二列最小的那一行 ,只打印2,3,4列 。
a.log 的数据如下:
12|20140101121221|aaa|7|232|163bai   
12|20140101103323|aaa|7|232|163bai
12|20140101233121|aaa|8|232|163bai
12|20140101233111|ccc|8|232|163bai
12|20140101433222|bbb|11|232|baidu
12|20140101331212|bbb|11|232|163baigool
12|20140101233321|bbb|10|232|163baigool

结果如下:
20140101103323|aaa|7
20140101233111|ccc|8
作者: q1208c    时间: 2014-06-06 12:40
  1. grep -F -w 163bai file1 | awk -F'|' '{print $2"|"$3"|"$4}' | sort -t '|' -k3,3 -u
复制代码
我只会笨办法.
作者: Herowinter    时间: 2014-06-06 12:53
本帖最后由 Herowinter 于 2014-06-06 13:23 编辑

回复 1# wzltian
  1. awk  -F'|' '$6=="163bai"{if(!min[$3]||$2<min[$3]){min[$3]=$2;a[$3]=$2"|"$3"|"$4}} END{for(i in a)print a[i]}' i
  2. 20140101103323|aaa|7
  3. 20140101233111|ccc|8
复制代码

作者: prcardin    时间: 2014-06-06 13:07
测试了下,这个没有达到效果。按地3列排序、去重,没得到第二列最小的2 3 4列吧

回复 2# q1208c


   
作者: reyleon    时间: 2014-06-06 13:57
  1. sort -t "|" -k2,2n file | awk '$6=="163bai" && !a[$3]++ {print $2,$3,$4}' FS="|" OFS="|"
复制代码

作者: o枫叶o飘零    时间: 2014-06-06 14:34
查询出第6列等于163bai,按第三列去重,然后比较第二列,取第二列最小的那一行 ,只打印2,3,4列 。
a.log 的数据如下:
12|20140101121221|aaa|7|232|163bai   
12|20140101103323|aaa|7|232|163bai
12|20140101233121|aaa|8|232|163bai
12|20140101233111|ccc|8|232|163bai
12|20140101433222|bbb|11|232|baidu
12|20140101331212|bbb|11|232|163baigool
12|20140101233321|bbb|10|232|163baigool




我按照楼主的意思分析如下   
1.查询出第6列等于163bai
结果如下
12|20140101121221|aaa|7|232|163bai   
12|20140101103323|aaa|7|232|163bai
12|20140101233121|aaa|8|232|163bai
12|20140101233111|ccc|8|232|163bai
2.按第三列去重
12|20140101233121|aaa|8|232|163bai
12|20140101233111|ccc|8|232|163bai
3.然后比较第二列,取第二列最小的那一行
12|20140101233111|ccc|8|232|163bai
4.只打印2,3,4列
20140101233111|ccc|8

楼主怎么会得出有2行数据?
还是我理解错了?


作者: Herowinter    时间: 2014-06-06 14:53
回复 6# o枫叶o飘零
楼主的描述"按第三列去重"有点问题,但也不必细纠,
相当于建以第3列 第6列为key,第2列为value的hash,
然后取第2列值最小的那个,在楼主的题里,他还限定了第6列的
值只能为一个固定的值。
   
作者: o枫叶o飘零    时间: 2014-06-06 15:00
回复 7# Herowinter


    你是楼主肚子里面的蛔虫
作者: asdf2110    时间: 2014-06-06 15:29
  1. $ awk -F"|" '$6=="163bai" {if ($2 < a[$3] || a[$3] == 0){a[$3]=$2;b[$3]=$0;}}END{for (i in b) print b[i];}' a.log
  2. 12|20140101103323|aaa|7|232|163bai
  3. 12|20140101233111|ccc|8|232|163bai
复制代码

作者: hhdzhu    时间: 2014-06-06 16:07
回复 5# reyleon


    您好,我知道-k和-n的意思,但是-2k,2n是啥意义啊求指教
作者: q1208c    时间: 2014-06-06 16:14
本帖最后由 q1208c 于 2014-06-06 16:18 编辑

回复 4# prcardin


  sorry, 我忘了这个条件了.
  1. grep -F -w 163bai file1 | awk -F'|' '{print $2"|"$3"|"$4}' | sort | sort -t '|' -k2,2 -u
复制代码

作者: wzltian    时间: 2014-06-06 18:02
回复 3# Herowinter

  谢谢了,高手
   
作者: wzltian    时间: 2014-06-06 18:03
回复 9# asdf2110


    牛,我试一下
作者: reyleon    时间: 2014-06-06 18:54
回复 10# hhdzhu


    -k2,2n  表示仅仅按照第二列数字大小排序
作者: MeRcy_PM    时间: 2014-06-07 01:14
grep "163bai" aaa -w | awk -F'|' '{if(!a[$3]){a[$3]=$3;str[$3]=$2"|"$3"|"$4};if(a[$3]&&a[$3]<=$4){str[$3]=$2"|"$3"|"$4}}END{for(i in a){print str[i]}}'
菜鸟写的比较搓
作者: zooyo    时间: 2014-06-07 15:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: Herowinter    时间: 2014-06-07 16:18
回复 18# zooyo
嗯,多谢指点。
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2