免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助如何求文件中最大值和次最大值并输出成行,谢谢 [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:51:33
发表于 2015-03-05 23:38 |显示全部楼层
本帖最后由 angjzy 于 2015-03-10 00:00 编辑

如题:
有100个文件1.dat到100.dat
每个dat下有两列数,并且都不相等
例如:
1.dat

     5.18099                0
     5.92113         0.139141
      6.2912          1.94788
     7.77148          248.778
     8.14155          261.301
     8.51162           251.28
     8.88169          284.605
     9.25177          278.416

2.dat

     7.41685          162.501
      7.7877           285.29
     8.15854          255.792
     8.52938          239.859
     8.90023           299.83
     9.27107           269.22
     9.64191          156.519
     10.0128          63.3725

想得到第二列数中的两个最大值分别对应的第一列中的数,输出到p.dat
9.25177  8.88169
7.7877    8.90023

依次类推从第一个到第100个,读文件可以用for 循环,但是还不知道如何将次最大值提取出来
谢谢大神

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
发表于 2015-03-05 23:59 来自手机 |显示全部楼层
对每个文件而言
首先sort,即按照第二列逆序排列
然后提取前两行地一列
手机敲不了指令,说个思路供参考

论坛徽章:
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
发表于 2015-03-06 00:25 |显示全部楼层
本帖最后由 jason680 于 2015-03-06 15:13 编辑

回复 1# angjzy

some bug and modified

$ awk -vN=2 'function p(){if(V[0]=="")return;for(n=N-1;n>=0;n--)printf V[n]" ";print"";delete M;delete V}ARGIND!=D{D=ARGIND;p()}{M[N]=$2;V[N]=$1;for(n=N;n;n--){if(M[n]<M[n-1])next;m=M[n-1];M[n-1]=M[n];M[n]=m;v=V[n-1];V[n-1]=V[n];V[n]=v}}END{p()}' [1-9].dat
9.25177 8.88169
7.7877 8.90023

   

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
发表于 2015-03-06 00:45 |显示全部楼层
  1. sort -k2r 1.dat | awk  'NR==1{a=$1}NR==2{b=$1}END{print a,b}' >> hello
复制代码
这里的1.dat 可以更换为你想要处理的文件,可以利用循环来处理即可。
>>hello将这些文件追加输出到hello中,
你可能想调整顺序,print b,a即可

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
发表于 2015-03-06 09:18 |显示全部楼层
  1. #!/usr/bin/env python3

  2. def func(*arg):
  3.     result = []
  4.     stacks = []
  5.     for file in arg:      
  6.         with open(file) as f:
  7.             _result = [0,0] #保存两个最大数对应的第一列
  8.             _stacks = [0,0] #保存两个最大数
  9.             line_statcks = [0,0] #读取一行
  10.             for line in f:
  11.                 line_stacks = [float(x) for x in line.replace("\n", "").split()]
  12.                 if line_stacks[1] > _stacks[0]:
  13.                     _stacks[0] = line_stacks[1]
  14.                     _result[0] = line_stacks[0]
  15.                     continue
  16.                 elif line_stacks[1] > _stacks[1]:
  17.                     _stacks[1] = line_stacks[1]
  18.                     _result[1] = line_stacks[0]

  19.         result.append(_result)
  20.         stacks.append(_stacks)
  21.     return result


  22. print(func("1.dat", "2.dat"))
复制代码

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
发表于 2015-03-06 09:23 |显示全部楼层
本帖最后由 我是一隻羊 于 2015-03-06 09:36 编辑
  1. awk '{if($2>X){N=M;M=$1;Y=X;X=$2}else if($2>Y){N=$1;Y=$2}}END{print M,N}' inputfile
复制代码
  1. awk  '{f=FILENAME;if($2>X[f]){N[f]=M[f];M[f]=$1;Y[f]=X[f];X[f]=$2}else if($2>Y[f]){N[f]=$1;Y[f]=$2}}END{for(i in M)print M[i],N[i]}' *.data > temp.log
复制代码

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2015-03-06 10:20 |显示全部楼层
本帖最后由 tuyajie 于 2015-03-06 10:20 编辑

是不是一定要awk?

不是可以
for ((i=1; i<=100;i+))
do
cat ${i}.dat | sort -r -nk 2,2| head -2 | awk '{printf($1" ")}'
done

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
发表于 2015-03-06 10:28 |显示全部楼层
本帖最后由 LikeLx 于 2015-03-06 16:01 编辑
  1. awk 'FNR==1&&NR!=FNR{i=asort(a,b);print c[b[i]],c[b[i-1]]}{c[$2]=$1;a[NR]=$2}END{i=asort(a,b);print c[b[i]],c[b[i-1]]}'
复制代码

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015小元宵徽章
日期:2015-03-06 15:58:18每日论坛发贴之星
日期:2015-06-08 22:20:00每日论坛发贴之星
日期:2015-06-08 22:20:00操作系统版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2015-11-09 06:20:00数据库技术版块每日发帖之星
日期:2016-02-22 06:20:0015-16赛季CBA联赛之上海
日期:2017-01-01 23:58:53
发表于 2015-03-06 10:56 |显示全部楼层
本帖最后由 zl624867243 于 2015-03-06 10:57 编辑

#!/bin/bash
for ((i=1;i<=100;i++))
do
  sort -k 2 /root/shell_scripts/$i.dat | tail -2 | awk '{print $1}' | paste -s >> p.dat
done
echo "all have done"

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015小元宵徽章
日期:2015-03-06 15:58:18每日论坛发贴之星
日期:2015-06-08 22:20:00每日论坛发贴之星
日期:2015-06-08 22:20:00操作系统版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2015-11-09 06:20:00数据库技术版块每日发帖之星
日期:2016-02-22 06:20:0015-16赛季CBA联赛之上海
日期:2017-01-01 23:58:53
发表于 2015-03-06 11:05 |显示全部楼层
回复 6# 我是一隻羊
你总是喜欢一行去完成 ,改成一行 我有时候 就不知道什么时候用中括号或者什么时候用小括号了或者什么时候用分号了特别是awk。
这个有什么诀窍吗?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP