免费注册 查看新帖 |

Chinaunix

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

[文本处理] 将同一人的最大号和最小号分别输入到A、B中,另外中间值输入到C中 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-06 15:39 |只看该作者 |倒序浏览
各位高手,帮忙处理下面文件,万分感谢

处理前:

小明 科目 1
小明 科目 2
小明 科目 3
小明 科目 4
小明 科目 5
小王 科目 1
小王 科目 2
小王 科目 3
小王 科目 4

将同一人的最大号和最小号分别输入到A、B中,另外中间值输入到C中

处理后:

A:小明 科目 1
     小王 科目 1

B:小明 科目 5
     小王 科目 4

C: 小明 科目 2
    小明 科目 3
    小明 科目 4
    小王 科目 2
    小王 科目 3

再次感谢!


论坛徽章:
769
金牛座
日期: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
2 [报告]
发表于 2014-07-06 16:16 |只看该作者
本帖最后由 Herowinter 于 2014-07-06 16:18 编辑

目测是这样的,不是很有信心没语法错误,将就着看吧。
  1. sort -n -k3,3 urfile|awk '{a[$1,$2,++b[$1,$2]]=$3} END{for(i in b)for(j=1;j<=b[i];j++){if(j==1)}dest="A";else if(j==b[i])dest="B";else dest="C";print i,a[i""SUBSEP""b[i]]>dest}'
复制代码

论坛徽章:
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
3 [报告]
发表于 2014-07-06 23:08 |只看该作者
  1. $ sort -k1,1 -k3,3n i | awk '{a[$1,++b[$1]]=$0}END{x="小明";y="小王";printf "%s\t%s\n\t%s\n\n","A:",a[x,1],a[y,1];printf "%s\t%s\n\t%s\n\n","B:",a[x,b[x]],a[y,b[y]];printf "C:";for(i=1;++i<b[x];)print "\t"a[x,i];for(i=1;++i<b[y];)print "\t"a[y,i]}'
  2. A:      小明 科目 1
  3.         小王 科目 1

  4. B:      小明 科目 5
  5.         小王 科目 4

  6. C:      小明 科目 2
  7.         小明 科目 3
  8.         小明 科目 4
  9.         小王 科目 2
  10.         小王 科目 3
复制代码

论坛徽章:
769
金牛座
日期: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
4 [报告]
发表于 2014-07-07 10:37 |只看该作者
回复 3# yestreenstars

对比了下大神的代码,果然发现不少错误,现在改了下。
  1. sort -k1,1 -k3,3n i|awk '{a[$1" "$2,++b[$1" "$2]]=$3} END{for(i in b)for(j=1;j<=b[i];j++){if(j==1)dest="A";else if(j==b[i])dest="B";else dest="C";print i,a[i"\034"j]>dest}}'
  2. [masonzhu@rat122 zzz]$ cat A
  3. 小明 科目 1
  4. 小王 科目 1
  5. [masonzhu@rat122 zzz]$ cat B
  6. 小明 科目 5
  7. 小王 科目 4
  8. [masonzhu@rat122 zzz]$ cat C
  9. 小明 科目 2
  10. 小明 科目 3
  11. 小明 科目 4
  12. 小王 科目 2
  13. 小王 科目 3
复制代码
目测楼主实际需求中 科目是会变化的,所以拿$1作key可能还不够。

   

论坛徽章:
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
5 [报告]
发表于 2014-07-07 10:44 |只看该作者
回复 4# Herowinter

会不会变我就不知道了,管它呢,谁叫楼主给出的数据是这样的呢~
   

论坛徽章:
0
6 [报告]
发表于 2014-07-07 11:03 |只看该作者
这里没用sort排序的,用判断最大与最小,很不精简
  1. awk '{a[$1FS$2]=a[$1FS$2]!=""?a[$1FS$2]" "$3:$3}
  2. END{

  3.     for (x in a )
  4.     {
  5.         i=split(a[x],str);
  6.         max=0;min=100;
  7.         for(y=1;y<=i;y++)
  8.         {
  9.             if (str[y]>max)max=str[y];
  10.             if (str[y]<min)min=str[y];
  11.         }
  12.         b=b!=""?b"\n   "x" "min:"A:"x" "min;
  13.         c=c!=""?c"\n   "x" "max:"B:"x" "max;
  14.     for(y=1;y<=i;y++)
  15.     {
  16.         if(str[y]!=min && str[y]!=max)
  17.             {
  18.                 d=d!=""?d"\n   "x" "str[y]:"C:"x" "str[y];
  19.             }

  20.     }
  21.     }
  22.     print b;
  23.     print c;
  24.     print d;

  25. }' awk1
复制代码
结果
  1. A:小王 科目 1
  2.    小明 科目 1
  3. B:小王 科目 4
  4.    小明 科目 5
  5. C:小王 科目 2
  6.    小王 科目 3
  7.    小明 科目 2
  8.    小明 科目 3
  9.    小明 科目 4
复制代码

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
7 [报告]
发表于 2014-07-07 12:35 |只看该作者
sort -k1,3n 1 |awk '{if(!a[$1]++){print >>"A"}else {if($1==l)print d>>"C";else print d>>"B";d=$0;l=$1}}END{print >>"B"}'

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
8 [报告]
发表于 2014-07-08 11:28 |只看该作者
本帖最后由 rulebook 于 2014-07-08 11:58 编辑
  1. awk 'NR==FNR&&a[$1]==""{a[$1]=b[$1]=$3;next} NR==FNR&&$3>a[$1]{a[$1]=$3;next} NR==FNR&&$3<b[$1]{b[$1]=$3;next} ARGIND==2&&b[$1]<$3&&$3<a[$1]{c[$1]=c[$1]!=""?c[$1]"\n"$1" "$2" "$3:$1" "$2" "$3} END{for(i in a){print i" 科目 "a[i]>>"b.txt";print i" 科目 "b[i]>>"a.txt";print c[i]>>"c.txt"}}' o o
复制代码
改一下...

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
9 [报告]
发表于 2014-07-08 17:39 |只看该作者
本帖最后由 li0924 于 2014-07-08 17:39 编辑

@LZ:这里需要源文件最后保留一个空行
  1. awk '{if(! a[$1,$2]++){min[NR]=$0;max[NR-1]=s}s=mid[NR]=$0}END{for(i=1;i<NR;i++){if(max[i])print max[i]>>"A";else if(min[i])print min[i]>>"B";else print mid[i]>>"C"}}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP