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
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
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
20140101103323|aaa|7
20140101233111|ccc|8
复制代码
作者:
prcardin
时间:
2014-06-06 13:07
测试了下,这个没有达到效果。按地3列排序、去重,没得到第二列最小的2 3 4列吧
回复
2#
q1208c
作者:
reyleon
时间:
2014-06-06 13:57
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
$ 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
12|20140101103323|aaa|7|232|163bai
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, 我忘了这个条件了.
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