免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何根据字符串的个数进行排序呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-05-17 19:40 |只看该作者 |倒序浏览
文件A有2列数据,如何根据第一列每个fam出现的次数排序得到文件B
fam       time
1731    3.94
1731    2.51
tork      4.60
tork      3.45
tork      1.98
sire       2.00
athila     3.27
athila     2.58
文件B
fam       time
tork      4.60
tork      3.45
tork      1.98
athila     3.27
athila     2.58
1731    3.94
1731    2.51
sire       2.00

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
2 [报告]
发表于 2018-05-17 20:22 |只看该作者
本帖最后由 wh7211 于 2018-05-17 21:11 编辑

回复 1# wd_my


<<<awk4.0+
  1. awk 'NR==1;NR>1{a[$1]=a[$1]?a[$1]"\n"$0:$0;b[$1]++}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in b){print a[i]}}' A
复制代码

<<<awk3.0+
  1. awk 'NR==1;NR>1{a[$1]=++a[$1]" "$1;c[a[$1]]=b[$1]?b[$1]"\n"$0:$0;b[$1]=c[a[$1]]}END{e=asort(a,d);for(i=e;i>0;i--){print c[d[i]]}}' A
复制代码

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
3 [报告]
发表于 2018-05-18 12:59 |只看该作者
本帖最后由 christmas1102 于 2018-05-18 13:04 编辑

回复 2# wh7211

改了下数字 又不行了

[root@tt ~]# cat file
name          mem(%)
aa          2.2
aa          2.5
bb          4.6
bb          3.4
bb          3.1
bb          9.9
cc          2.9
dd          7.2
dd          8.5
dd          7.5


  1. awk2 'NR==1;NR>1{a[$1]=a[$1]?a[$1]"\n"$0:$0;b[$1]++}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in b){print a[i]}}' file
复制代码
输出结果:
name          mem(%)
bb          4.6
bb          3.4
bb          3.1
bb          9.9
dd          7.2
dd          8.5
dd          7.5
aa          2.2
aa          2.5
cc          2.9


论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2018-05-18 13:49 |只看该作者
本帖最后由 wh7211 于 2018-05-18 14:24 编辑

回复 3# christmas1102


文件A有2列数据,如何根据第一列每个fam出现的次数排序得到文件B

楼主的需求是“按出现的次数排序”,没说fam相同的行再按第2个域倒序

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
5 [报告]
发表于 2018-05-18 13:56 |只看该作者
本帖最后由 christmas1102 于 2018-05-18 14:00 编辑

回复 4# wh7211

"@val_num_desc";for(i in b) 是只对 b 的value做降序排列。
那是我理解错了,LZ的意思大致是 按照$1 出现的次数  降序排列,我以为是在这个基础上,$2的数据也进行降序排列,类似与:
c  3
c  2
c  1
a  2
a  1
b  5



那请问,如果在刚才 $1排列的基础上,$2 也要进行数值的降序排列,这该怎么写法?

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
6 [报告]
发表于 2018-05-18 15:23 |只看该作者
回复 5# christmas1102


<<<awk4.0+
  1. awk 'NR==1;NR>1{a[$1]++;b[$1][$2]=$2}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in a){for(j in b[i]){print i,b[i][j]}}}' file
复制代码

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
7 [报告]
发表于 2018-05-18 15:37 |只看该作者
回复 6# wh7211

厉害!每次看你写的awk代码,都是看得懂,写不出..学习了。

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
8 [报告]
发表于 2018-05-19 19:05 |只看该作者
本帖最后由 christmas1102 于 2018-05-19 21:26 编辑

回复 1# wd_my

#!/usr/local/python
#-*- coding: utf-8 -*-
import re
import sys

l2 = []
l1 = []
d1 = {}

title1 = title2 = ''
f1 = open(sys.argv[1],"r+")
for line in f1.readlines():
    a01 = line.split()
    if re.match(r'[^\d+]+',a01[1]):
        title1 = a01[0]
        title2 = a01[1]
        continue
    l1.append(tuple(a01))
f1.close()
## memo
a04 = sorted(l1,key=lambda x:float(x[1]),reverse=True)
for i1 in a04:
    l2.append(i1[0])
for i2 in set(l2):
    d1[i2] = l2.count(i2)

## memo
a05 = sorted(d1.items(),key=lambda x:int(x[1]),reverse=True)

## memo
print("%s%8s" % (title1,title2))
for ii2 in a05:
    for ii3 in a04:
        if re.match(ii2[0],ii3[0]):
            for x,y in zip(ii3[0::2],ii3[1::2]):
                print("%s%8s" % (x,y))


command line>> python2或3 py01.py FILENAME
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP