免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理求助 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-28 22:37 |只看该作者 |倒序浏览
大家好!
我有一个问题向大家请教。

我有两个列表:
  1. list1:
  2. 64646 64647 64648 64649 64650 64651 64652 64653 64654 64655 64656 64657 64658 64659 64660
  3. list2:
  4. 64657 64650 64654 64660 64646 64647 64656 64651 64652 64659
复制代码
我想找到列表1中有的而列表2中没有的最小的一个数。
请问用awk怎么能得到这个数呢?
谢谢。

论坛徽章:
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-08-28 22:41 |只看该作者
本帖最后由 Herowinter 于 2014-08-28 22:49 编辑

回复 1# bikkuri

请问列表的存储形式?

列表1先排序,然后从小到大一个个判断是不是存在于列表2中?
伪代码这样:
  1. sort(list1)
  2. for(i=1;i<=list1.length();i++)
  3.     if(!(list1[i] in list2))
  4.         return list1[i]
  5. return -1//not found   
复制代码

论坛徽章:
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
3 [报告]
发表于 2014-08-28 22:51 |只看该作者
回复 1# bikkuri

$ awk 'NR==FNR{for(n=1;n<=NF;n++)a[$n]=1;next}{for(n=1;n<=NF;n++){if(!a[$n])if(m>$n||m=="")m=$n}}END{print m}' list2 list1
64648

   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
4 [报告]
发表于 2014-08-28 23:35 |只看该作者
本帖最后由 reb00t 于 2014-08-29 00:27 编辑
  1. awk  -vRS=' '  'NR==FNR{a[$1];next}!($0 in a){if(m>$0||m=="")m=$0}END{print m}'  b a
  2. 64648

  3. head b a
  4. ==> b <==
  5. 64657 64650 64654 64660 64646 64647 64656 64651 64652 64659

  6. ==> a <==
  7. 64646 64647 64648 64649 64650 64651 64652 64653 64654 64655 64656 64657 64658 64659 64660
复制代码
参照2楼的思路写一个。
  1. <?php
  2. $str1="64657 64650 64654 64660 64646 64647 64656 64651 64652 64659";
  3. $str2="64646 64647 64648 64649 64650 64651 64652 64653 64654 64655 64656 64657 64658 64659 64660";
  4. $arr1 = explode(" ",$str1);
  5. $arr2 = explode(" ",$str2);
  6. sort($arr1);
  7. sort($arr2);
  8.   foreach ($arr2 as  $v) {
  9.             if( in_array($v, $arr1)){
  10.          //echo "{$v}存在\n";
  11.             }else {
  12.                      echo "{$v}\n";
  13.                      break;
  14.             }
  15. }

  16. ?>
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2014-08-28 23:40 |只看该作者
非常感谢!

还有另外一个问题:

我有一个很长的名单,以  “名字:所在城市” 的格式存放。
  1. namelist='zhang:beijing charles:newyork igarashi:tokyo kawanami:tokyo thomas:newyork amemiya:tokyo ....'
复制代码
我希望得到这样一个数据处理的输出结果:
1.得到所有城市的列表并按字母顺序排序;
2.对于每个城市,统计出在该城市的人的数量,然后按每个人带4个家属,一共预留5个位置;
例如以上列表,希望得到以下输出:
  1. beijing:1 2 3 4 5
  2. newyork:6 7 8 9 10 11 12 13 14 15
  3. tokyo:16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
复制代码
请问应该如何处理以上文本呢?
谢谢!

论坛徽章:
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
6 [报告]
发表于 2014-08-29 00:17 |只看该作者
回复 5# bikkuri

$ awk -F"[ =':]+" '{for(n=3;n<NF;n+=2)a[$n]++}END{t=asorti(a,b);for(n=1;n<=t;n++){printf b[n]":";printf a[b[n]];print""}}' FILE
beijing:1
newyork:2
tokyo:3

your job: change printf a[b[n]] to for(...){..} to get what you want

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2014-08-29 00:24 |只看该作者
本帖最后由 bikkuri 于 2014-08-29 00:29 编辑

谢谢您的回复。
但是有两个问题:
一是在我的busybox上的awk不支持asorti函数;二是我希望的输出的后面的城市的编号是顺着前面的城市往下排的,而不是单纯的5乘以人数。
谢谢。

回复 6# jason680


   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
8 [报告]
发表于 2014-08-29 01:10 |只看该作者
本帖最后由 reb00t 于 2014-08-29 01:11 编辑
  1. <?php
  2. $str="namelist='zhang:beijing charles:newyork igarashi:tokyo kawanami:tokyo thomas:newyork amemiya:tokyo'";

  3. $pa='/[: \']+/';
  4. $arr = preg_split("$pa", $str);
  5. $newarr=array();

  6. for ($i=2; $i <count($arr) ; $i+=2) {
  7.    $newarr[]=$arr[$i];
  8. }
  9. sort($newarr);
  10. $countarry=array_count_values($newarr);
  11. foreach ($countarry as $key => $value) {   
  12.     echo $key.":".$value."\n";
  13.        }

  14. ?>

  15. 结果:
  16. beijing:1
  17. newyork:2
  18. tokyo:3
  19. [Finished in 0.7s]
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
9 [报告]
发表于 2014-08-29 07:21 |只看该作者
谢谢您的答复。
但是我的busybox上没有php。
而且我希望得到的结果是:
  1. beijing:1 2 3 4 5
  2. newyork:6 7 8 9 10 11 12 13 14 15
  3. tokyo:16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
复制代码
回复 8# reb00t


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
10 [报告]
发表于 2014-08-31 17:39 |只看该作者
本帖最后由 bikkuri 于 2014-08-31 18:34 编辑

不好意思,有一种情况没有得到正确的结果,就是list2为空的情况。
如果要考虑list2可能为空的情况的话,代码应该怎么改呢?
  1. [std@hp8:test]$ l
  2. total 4
  3. -rw-r--r-- 1 std users 120 Aug 31 17:36 list1
  4. -rw-r--r-- 1 std users   0 Aug 31 18:26 list2
  5. [std@hp8:test]$ cat list1
  6. 64649 64650 64651 64652 64653 64654 64655 64656 64657 64658 64659 64660 64661 64662 64663 64664 64665 64666 64667 64668
  7. [std@hp8:test]$ cat list2
  8. [std@hp8:test]$ awk 'NR==FNR{for(n=1;n<=NF;n++)a[$n]=1;next}{for(n=1;n<=NF;n++){if(!a[$n])if(m>$n||m=="")m=$n}}END{print m}' list2 list1

  9. [std@hp8:test]$
复制代码
正确的结果应该是64649。






回复 3# jason680



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP