wd_my 发表于 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

wh7211 发表于 2018-05-17 20:22

本帖最后由 wh7211 于 2018-05-17 21:11 编辑

回复 1# wd_my


<<<awk4.0+
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}}' A
<<<awk3.0+
awk 'NR==1;NR>1{a[$1]=++a[$1]" "$1;c]=b[$1]?b[$1]"\n"$0:$0;b[$1]=c]}END{e=asort(a,d);for(i=e;i>0;i--){print c]}}' A

christmas1102 发表于 2018-05-18 12:59

本帖最后由 christmas1102 于 2018-05-18 13:04 编辑

回复 2# wh7211

改了下数字 又不行了

# 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


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}}' 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


wh7211 发表于 2018-05-18 13:49

本帖最后由 wh7211 于 2018-05-18 14:24 编辑

回复 3# christmas1102


文件A有2列数据,如何根据第一列每个fam出现的次数排序得到文件B
楼主的需求是“按出现的次数排序”,没说fam相同的行再按第2个域倒序

christmas1102 发表于 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的数据也进行降序排列,类似与:
c3
c2
c1
a2
a1
b5



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

wh7211 发表于 2018-05-18 15:23

回复 5# christmas1102


<<<awk4.0+
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){print i,b}}}' file

christmas1102 发表于 2018-05-18 15:37

回复 6# wh7211

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

christmas1102 发表于 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,"r+")
for line in f1.readlines():
    a01 = line.split()
    if re.match(r'[^\d+]+',a01):
      title1 = a01
      title2 = a01
      continue
    l1.append(tuple(a01))
f1.close()
## memo
a04 = sorted(l1,key=lambda x:float(x),reverse=True)
for i1 in a04:
    l2.append(i1)
for i2 in set(l2):
    d1 = l2.count(i2)

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

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


command line>> python2或3 py01.py FILENAME
页: [1]
查看完整版本: 如何根据字符串的个数进行排序呢