免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理-先分组后排序 [复制链接]

论坛徽章:
1
水瓶座
日期:2015-01-24 08:46:39
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-18 22:30 |只看该作者 |倒序浏览
题目要求:
1.以aa-cd-dd-xx 中最后一列xx分组,并对每组中的IP:2.2.3.XXX 对最后一组XXX再进行排序。
2.简述,先分组然后排序
ab-cd-rc-ab 3.2.3.46
ab-cd-cc-ee 1.2.3.41
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
fd-fe-er-fe 2.3.4.51
aa-er-vd-cd 3.4.5.61
zz-sd-jk-ee 5.6.7.82
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.21
ee-ad-df-fc 4.5.6.9
ad-ee-cd-er 5.4.3.23
bc-ki-ee-ee 0.3.4.5
bc-ki-ee-db 0.3.4.125
bc-ki-ee-db 0.3.4.12
bc-ki-de-fg 0.3.4.225
bc-ki-de-fg 0.3.4.25
要求的结果:
ab-cd-cc-aa 1.2.3.43
ab-cd-cc-aa 1.2.3.49
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225

想用awk解决,可是没有思路,希望大家有空帮我看看。谢谢。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2015-06-18 23:20 |只看该作者
回复 1# gameb_y

gawk 4.0+
  1. awk '{match($0,/^.+-([^ ]+).*\.([^.]+)$/,a);b[a[1]][a[2]]=$0}END{for(i=1;i<=asorti(b,e);i++){for(j in b[e[i]])c[++n]=j;for(m=asort(c);m>0;m--)print b[e[i]][c[m]];n=0;delete c}}'

复制代码

论坛徽章:
1
水瓶座
日期:2015-01-24 08:46:39
3 [报告]
发表于 2015-06-18 23:30 |只看该作者
回复 2# yinyuemi


    谢谢指点。

论坛徽章:
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 [报告]
发表于 2015-06-18 23:40 |只看该作者
awk 4.0+
  1. awk '{split($2,a,".");b[$1][a[4]]=$0;c[$1][a[4]]=a[4]}END{for(i=0;i++<asorti(b,d);){for(j=0;j++<asort(c[d[i]],e);)print b[d[i]][e[j]]}}'
复制代码

论坛徽章:
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
5 [报告]
发表于 2015-06-19 00:04 |只看该作者
回复 1# gameb_y

$ awk '{t1=split($1,a1,"-");t2=split($2,a2,".");k=sprintf("%5s%03d",a1[t1],a2[t2]);a[k]=(a[k]?a[k]"\n"$0:$0)}END{t=asorti(a,b);for(n=1;n<=t;n++)print a[b[n]]}' FILE
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2015-06-19 09:45 |只看该作者
  1. # sort -t "." -k1.10,1.11 -k4n e
  2. ab-cd-cc-aa 1.2.3.42
  3. ab-cd-cc-aa 1.2.3.49
  4. ab-cd-rc-ab 3.2.3.46
  5. aa-er-vd-cd 3.4.5.61
  6. bc-ki-ee-db 0.3.4.12
  7. bc-ki-ee-db 0.3.4.125
  8. bc-ki-ee-ee 0.3.4.5
  9. ab-cd-cc-ee 1.2.3.41
  10. zz-sd-jk-ee 5.6.7.82
  11. ad-ee-cd-er 5.4.3.23
  12. ee-ad-df-fc 4.5.6.7
  13. ee-ad-df-fc 4.5.6.9
  14. ee-ad-df-fc 4.5.6.21
  15. fd-fe-er-fe 2.3.4.51
  16. bc-ki-de-fg 0.3.4.25
  17. bc-ki-de-fg 0.3.4.225
复制代码

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
7 [报告]
发表于 2015-06-19 11:40 |只看该作者
  1. perl -e 'print map {$_->[0]} sort {$a->[1] cmp $b->[1] || $a->[2] <=> $b->[2]} map {/(..) .*\.(.+)/;[$_,$1,$2]} <>;' file2
  2. ab-cd-cc-aa 1.2.3.42
  3. ab-cd-cc-aa 1.2.3.42
  4. ab-cd-rc-ab 3.2.3.46
  5. aa-er-vd-cd 3.4.5.61
  6. bc-ki-ee-db 0.3.4.12
  7. bc-ki-ee-db 0.3.4.125
  8. bc-ki-ee-ee 0.3.4.5
  9. ab-cd-cc-ee 1.2.3.41
  10. zz-sd-jk-ee 5.6.7.82
  11. ad-ee-cd-er 5.4.3.23
  12. ee-ad-df-fc 4.5.6.7
  13. ee-ad-df-fc 4.5.6.9
  14. ee-ad-df-fc 4.5.6.21
  15. fd-fe-er-fe 2.3.4.51
  16. bc-ki-de-fg 0.3.4.25
  17. bc-ki-de-fg 0.3.4.225
复制代码
回复 1# gameb_y


   

论坛徽章:
1
水瓶座
日期:2015-01-24 08:46:39
8 [报告]
发表于 2015-06-19 23:24 |只看该作者
[ 本帖最后由 gameb_y 于 2015-06-24 23:20 编辑 ]

谢谢大家的帮助。我总结了如下两种方法。
简单易用的
[root@C66-test ~]# sort -t "." -k 1.10,1.11 -k 4,4n 20k.txt
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225

##此处是一个小技巧:
1.-k 4,4 与 -k 4 区别就是
-k 4,4 是第四个字段的开始到结尾
-k 4 是第四个字段的开始到行尾
这里结果是相同的
2.-k 4,4n
对本字段,使用 -n 排序,就可以写成这样。
扩展 -k 4nr 就是逆序了。

难懂的 awk方法
[root@C66-test ~]# cat 20k.awk
#!/bin/awk
###groups and then sort the ip
###modified by wxr 20150619
{
t1=split($1,a1,"-");
t2=split($2,a2,".");
k=sprintf("%5s%03d",a1[t1],a2[t2]);
a[k]=(a[k]?a[k]"\n"$0:$0)
}

END{
t=asorti(a,b);
for(n=1;n<=t;n++)
print a[b[n]]
}
[root@C66-test ~]# awk -f 20k.awk 20k.txt
ab-cd-cc-aa 1.2.3.42
ab-cd-cc-aa 1.2.3.42
ab-cd-rc-ab 3.2.3.46
aa-er-vd-cd 3.4.5.61
bc-ki-ee-db 0.3.4.12
bc-ki-ee-db 0.3.4.125
bc-ki-ee-ee 0.3.4.5
ab-cd-cc-ee 1.2.3.41
zz-sd-jk-ee 5.6.7.82
ad-ee-cd-er 5.4.3.23
ee-ad-df-fc 4.5.6.7
ee-ad-df-fc 4.5.6.9
ee-ad-df-fc 4.5.6.21
fd-fe-er-fe 2.3.4.51
bc-ki-de-fg 0.3.4.25
bc-ki-de-fg 0.3.4.225
###脚本解释
#!/bin/awk
###groups and then sort the ip
###modified by wxr 20150619
{
t1=split($1,a1,"-")     
t2=split($2,a2,".")

k=sprintf("%5s%03d",a1[t1],a2[t2])
#sprintf不会输出到屏幕,会输出到变量k中,格式就是 sprintf 里面规定的,%5s%03d
a1[t1],a2[t2] a1[4],a2[4]

a[k]=(a[k]?a[k]"\n"$0:$0)
##这是一个 ? : 条件运算符
if (a[k]) ;then
a[k]= a[k]"\n"$0;
else
a[k]=$0
fi
}

##处理完
END{
t=asorti(a,b);
#对数组a的下标进行排序,并把排序结果存放到b中,且b的数组名从1开始。
#asorti返回值是数组中元素的个数
for(n=1;n<=t;n++)
print a[b[n]]
###数组嵌套了。
}

##注释完了,还是不懂。放着吧。

最后谢谢大家的帮助,新手不懂如何@。

论坛徽章:
1
水瓶座
日期:2015-01-24 08:46:39
9
发表于 2015-06-19 23:25
回复 4# yestreenstars


    谢谢

论坛徽章:
1
水瓶座
日期:2015-01-24 08:46:39
10
发表于 2015-06-19 23:26
回复 5# jason680


    谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP