免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8545 | 回复: 14
打印 上一主题 下一主题

[文本处理] 请教在awk中如何根据特定字段进行排序? [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-06 14:11 |只看该作者 |倒序浏览
大家新年好!
我有一个问题向大家请教。
有以下文本:
  1.   [2014-02-06 13:45:11][root@hp7] modified [GSGN.db][92]
  2.   [2014-02-06 13:45:10][john@hp7] modified [SGSN.db][63]
  3.   [2014-02-06 13:50:11][root@hp8] modified [MME.db][66]
  4.   [2014-02-06 13:45:11][jane@hp6] modified [HSS.db][92]
  5.   [2014-02-06 13:45:10][sam@hp7] modified [SGSN.db][63]
  6.   [2014-02-06 13:50:11][root@hp8] modified [PCRF.db][66]
复制代码
希望首先对host也就是hp6, hp7,hp8进行排序,然后根据用户名root john jane sam进行排序。
如果以上文本太麻烦的话,只告诉我如何对下面这个文本进行排序就可以了。
  1. 2014-02-06 13:45:11 root hp7 modified GSGN.db 92
  2. 2014-02-06 13:45:10 john hp7 modified SGSN.d 63
  3. 2014-02-06 13:50:11 root hp8 modified MME.db 66
  4. 2014-02-06 13:45:11 jane hp6 modified HSS.db 92
  5. 2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
  6. 2014-02-06 13:50:11 root hp8 modified PCRF.db 66
复制代码
即如何先对$4排序,然后对$3排序。
谢谢!

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
2 [报告]
发表于 2014-02-06 15:05 |只看该作者
有点复杂,不如换个思路把,$3和$4位置调换,然后直接sort -k 3,4就好了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2014-02-06 17:27 |只看该作者
回复 1# bikkuri


>>即如何先对$4排序,然后对$3排序。

$ sort -k4,4 -k3,3 FILE
2014-02-06 13:45:11 jane hp6 modified HSS.db 92
2014-02-06 13:45:10 john hp7 modified SGSN.d 63
2014-02-06 13:45:11 root hp7 modified GSGN.db 92
2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
2014-02-06 13:50:11 root hp8 modified MME.db 66
2014-02-06 13:50:11 root hp8 modified PCRF.db 66

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2014-02-07 00:23 |只看该作者
  1. sort -k4,4 -k3,3
复制代码

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
5 [报告]
发表于 2014-02-09 20:24 |只看该作者
  1. arr=(root,john,jane,sam);awk -var=${arr[@]} '{l=split(ar,b,",");for(i=1;i<=l;++i)if($3==b[i])print $0,i}' file | sort -k4,4 -k8,8n | awk 'NF--'
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2014-02-16 19:52 |只看该作者
本帖最后由 bikkuri 于 2014-02-16 12:53 编辑

我在busybox下的sort不支持用-k参数对指定字段进行排序啊:
  1. root@box:/tmp# sort -h
  2. sort: invalid option -- h
  3. BusyBox v1.19.4 (2012-08-26 12:49:54 UTC) multi-call binary.

  4. Usage: sort [-nru] [FILE]...

  5. Sort lines of text

  6.         -n      Sort numbers
  7.         -r      Reverse sort order
  8.         -u      Suppress duplicate lines

  9. root@box:/tmp#
复制代码
能不能不用sort直接用awk进行排序呢?

论坛徽章:
0
7 [报告]
发表于 2014-02-16 22:41 |只看该作者
回复 6# bikkuri
楼主您好,我在手机上也用busybox的,如果sort没有-k参数的话,不知道awk里有没有asort这些内建函数,我看了下我的上面没有,不过长期用AIX,所以自己也不太会用这些gnu里的函数,刚才去查了下

如果有的话,你就用简单的方法做
  1. $ awk '{a[$4$3NR]=$0;b[i++]=$4$3NR}END{asort(b,c);for(i=1;i<=length(c);i++){print a[c[i]]}}' best
  2. 2014-02-06 13:45:11 jane hp6 modified HSS.db 92
  3. 2014-02-06 13:45:10 john hp7 modified SGSN.d 63
  4. 2014-02-06 13:45:11 root hp7 modified GSGN.db 92
  5. 2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
  6. 2014-02-06 13:50:11 root hp8 modified MME.db 66
  7. 2014-02-06 13:50:11 root hp8 modified PCRF.db 66
复制代码
没有的话,代码就长点,应该可以的,如果排序不是你想要的结果,请再说。
  1. $ awk '{a[$4$3NR]=$0;b[i++]=$4$3NR}END{quicksort(b,0,length(b)-1);for(i=0;i<length(b);i++){print a[b[i]]}}function quicksort(b,p,r,q){if(p<r){q=partition(b,p,r);quicksort(b,p,q-1);quicksort(b,q+1,r)}}function partition(b,p,r,x,m,j,t){x=b[r];m=p;for(j=p;j<r;j++){if(b[j]<x){t=b[m];b[m]=b[j];b[j]=t;m++}}t=b[r];b[r]=b[m];b[m]=t;return m}' best
  2. 2014-02-06 13:45:11 jane hp6 modified HSS.db 92
  3. 2014-02-06 13:45:10 john hp7 modified SGSN.d 63
  4. 2014-02-06 13:45:11 root hp7 modified GSGN.db 92
  5. 2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
  6. 2014-02-06 13:50:11 root hp8 modified MME.db 66
  7. 2014-02-06 13:50:11 root hp8 modified PCRF.db 66
复制代码

论坛徽章:
771
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-02-17 09:23 |只看该作者
回复 7# runintostar
楼上的不错,asort和自己排序的方法都给了,
楼主根据busybox的实际情况自己选一个合适的吧。

   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
9 [报告]
发表于 2014-02-17 19:17 |只看该作者
本帖最后由 bikkuri 于 2014-02-17 12:20 编辑

您好,谢谢您的回复。
我在我的busybox下试了好像两个命令都不行:
  1. root@box:~/test# awk '{a[$4$3NR]=$0;b[i++]=$4$3NR}END{asort(b,c);for(i=1;i<=length(c);i++){print a[c[i]]}}' test.txt
  2. awk: cmd. line:1: Call to undefined function
  3. root@box:~/test# awk '{a[$4$3NR]=$0;b[i++]=$4$3NR}END{quicksort(b,0,length(b)-1);for(i=0;i<length(b);i++){print a[b[i]]}}function quicksort(b,p,r,q){if(p<r){q=partition(b,p,r);quicksort(b,p,q-1);quicksort(b,q+1,r)}}function partition(b,p,r,x,m,j,t){x=b[r];m=p;for(j=p;j<r;j++){if(b[j]<x){t=b[m];b[m]=b[j];b[j]=t;m++}}t=b[r];b[r]=b[m];b[m]=t;return m}' test.txt
  4. root@box:~/test# cat test.txt
  5. 2014-02-06 13:45:11 root hp7 modified GSGN.db 92
  6. 2014-02-06 13:45:10 john hp7 modified SGSN.d 63
  7. 2014-02-06 13:50:11 root hp8 modified MME.db 66
  8. 2014-02-06 13:45:11 jane hp6 modified HSS.db 92
  9. 2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
  10. 2014-02-06 13:50:11 root hp8 modified PCRF.db 66
  11. root@box:~/test#
复制代码
在标准的Linux下两个命令都是可以正常执行的。但是在busybox下却不行。
一个报错说调用未定义的函数,一个没有任何报错但也没有任何输出。
还有什么办法吗?
另外您是怎么在手机上使用busybox的啊?
iPhone上可以装busybox吗?

回复 7# runintostar


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2014-02-17 22:48 |只看该作者
本帖最后由 bikkuri 于 2014-02-17 15:51 编辑

把第二条命令中END后面输出部分循环里的i<length(b)改成i<NR以后可以输出,但是输出内容没有排序,和原文件一样,也就是说排序函数没有起作用。
同时在END后面print length(b)发现length(b)的值其实是0.
  1. root@box:~/test# awk '{a[$4$3NR]=$0;b[i++]=$4$3NR}END{print length(a),a,length(b),b;quicksort(b,0,length(b)-1);for(i=0;i<NR;i++){print a[b[i]]}}function quicksort(b,p,r,q){if(p<r){q=partition(b,p,r);quicksort(b,p,q-1);quicksort(b,q+1,r)}}function partition(b,p,r,x,m,j,t){x=b[r];m=p;for(j=p;j<r;j++){if(b[j]<x){t=b[m];b[m]=b[j];b[j]=t;m++}}t=b[r];b[r]=b[m];b[m]=t;return m}' test.txt
  2. 0  0
  3. 2014-02-06 13:45:11 root hp7 modified GSGN.db 92
  4. 2014-02-06 13:45:10 john hp7 modified SGSN.d 63
  5. 2014-02-06 13:50:11 root hp8 modified MME.db 66
  6. 2014-02-06 13:45:11 jane hp6 modified HSS.db 92
  7. 2014-02-06 13:45:10 sam hp7 modified SGSN.db 63
  8. 2014-02-06 13:50:11 root hp8 modified PCRF.db 66
  9. root@box:~/test#
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP