免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教利用脚本如何实现以下文件的分割 [复制链接]

论坛徽章:
0
发表于 2013-11-05 06:14 |显示全部楼层
本帖最后由 gigisor 于 2013-11-05 06:31 编辑

我有几千个文件,每个文件的每一行格式均如下:

文件1:

atno    1    TW    1.0    1.0    1.0
atno    6    TW    1.0    2.0    1.0
atno   11   TW    1.0    1.0    1.0
atno    1    TW    5.0    1.0    3.0
atno    6    TW    5.0    2.0    3.0
atno   11   TW    5.0    1.0    3.0

文件2:

atno    2    TW    1.0    1.0    1.0
atno    8    TW    1.0    2.0    1.0
atno   23   TW    1.0    1.0    1.0
atno    2    TW    5.0    1.0    3.0
atno    8    TW    5.0    2.0    3.0
atno   23   TW    5.0    1.0    3.0

每个文件隔若干行会发生重复,从上面示例中第二列的数字的重复即可看出,不同文件中第二行数字的序列可能不同,但都是升序,请问有无办法将所有文件中存在重复行的文件进行分割,例如某一文件名为sse.dat,存在两个个重复区域,如上示例,可否将其分化为sse-1.dat sse-2.dat,并删除sse.dat。先谢过。

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
发表于 2013-11-05 09:37 |显示全部楼层
回复 1# gigisor


    你上面有重复行么? 还是只看第2列或前3列是否有重复?

论坛徽章:
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
发表于 2013-11-05 09:47 |显示全部楼层
本帖最后由 yestreenstars 于 2013-11-05 09:48 编辑

有固定周期的可以这样做,从你提供的数据来看,固定周期为3,所以可以这么做:
  1. [root@localhost test]# ls
  2. sse.dat  test.dat
  3. [root@localhost test]# head sse.dat test.dat
  4. ==> sse.dat <==
  5. atno    1    TW    1.0    1.0    1.0
  6. atno    6    TW    1.0    2.0    1.0
  7. atno   11   TW    1.0    1.0    1.0
  8. atno    1    TW    5.0    1.0    3.0
  9. atno    6    TW    5.0    2.0    3.0
  10. atno   11   TW    5.0    1.0    3.0

  11. ==> test.dat <==
  12. atno    2    TW    1.0    1.0    1.0
  13. atno    8    TW    1.0    2.0    1.0
  14. atno   23   TW    1.0    1.0    1.0
  15. atno    2    TW    5.0    1.0    3.0
  16. atno    8    TW    5.0    2.0    3.0
  17. atno   23   TW    5.0    1.0    3.0
  18. [root@localhost test]# awk '{s=s?s"\n"$0:$0}!(FNR%3){split(FILENAME,a,".");print s > a[1]"-"++b[FILENAME]"."a[2];s=""}' *
  19. [root@localhost test]# ls
  20. sse-1.dat  sse-2.dat  sse.dat  test-1.dat  test-2.dat  test.dat
  21. [root@localhost test]# head sse-* test-*
  22. ==> sse-1.dat <==
  23. atno    1    TW    1.0    1.0    1.0
  24. atno    6    TW    1.0    2.0    1.0
  25. atno   11   TW    1.0    1.0    1.0

  26. ==> sse-2.dat <==
  27. atno    1    TW    5.0    1.0    3.0
  28. atno    6    TW    5.0    2.0    3.0
  29. atno   11   TW    5.0    1.0    3.0

  30. ==> test-1.dat <==
  31. atno    2    TW    1.0    1.0    1.0
  32. atno    8    TW    1.0    2.0    1.0
  33. atno   23   TW    1.0    1.0    1.0

  34. ==> test-2.dat <==
  35. atno    2    TW    5.0    1.0    3.0
  36. atno    8    TW    5.0    2.0    3.0
  37. atno   23   TW    5.0    1.0    3.0
  38. [root@localhost test]#
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2013-11-05 10:10 |显示全部楼层
gigisor 发表于 2013-11-05 06:14
我有几千个文件,每个文件的每一行格式均如下:
"每个文件隔若干行会发生重复,从上面示例中第二列的数字的重复即可看出"
文件1:


把重复的规则和可能出现的情况都弄清楚了,才好下手, 一个文件中只会存在一对重复内容,还是不确定? 每对重复的内容都是相邻的么?

论坛徽章:
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
发表于 2013-11-05 10:14 |显示全部楼层
回复 4# 关阴月飞
楼主给的数据太少,确实不好下手,我也只好碰碰运气了~

   

论坛徽章:
0
发表于 2013-11-06 00:09 |显示全部楼层
本帖最后由 gigisor 于 2013-11-06 00:28 编辑

先谢过楼上各位,不好意思给出的信息不够完善,现补充如下:

一个文件中存在的重复内容数量不确定,有的可能完全没重复,有的可能有一对,有的可能有50对。

如果出现重复,每对重复的内容都是相邻的。

一节重复的内容按照第二列数字大小升序逐行排列。

上述示例可改为:

文件1:

atno    1    TW    1.0    1.0    1.0
atno    6    TW    1.0    2.0    1.0
atno   11   TW    1.0    1.0    1.0
atno   18   TW    1.0    1.0    2.0
atno    1    TW    5.0    1.0    3.0
atno    6    TW    5.0    2.0    3.0
atno   11   TW    5.0    1.0    3.0
atno   18   TW    1.0    1.0    2.0

文件2:

atno    2    TW    1.0    1.0    1.0
atno    8    TW    1.0    2.0    1.0
atno   23   TW    1.0    1.0    1.0
atno    2    TW    5.0    1.0    3.0
atno    8    TW    5.0    2.0    3.0
atno   23   TW    5.0    1.0    3.0

我想这样就比较清楚了。

论坛徽章:
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
发表于 2013-11-06 09:04 |显示全部楼层
本帖最后由 yestreenstars 于 2013-11-06 11:26 编辑

回复 6# gigisor
感觉还是说得不是很清楚,有没有可能是这种情况?
1
2
3
1
2
3
A
B
A
B
楼主给多点数据,数据越多,写的脚本才能更匹配~
   

论坛徽章:
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
发表于 2013-11-06 09:26 |显示全部楼层
看我的可以达到要求不??
  1. awk 'BEGIN{b=1}{split(FILENAME,a,".")}{if(c>$2){close(a[1]"-"b"."a[2]);++b}c=$2;print > a[1]"-"b"."a[2]}' infile
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2013-11-06 09:59 |显示全部楼层
有没有可能出现这样的情况?即每四行重复一次,但每四行的第一二行是一样的?
  1. atno    1    TW    1.0    1.0    1.0
  2. atno    1    TW    1.0    1.0    1.0
  3. atno    6    TW    1.0    2.0    1.0
  4. atno   11   TW    1.0    1.0    1.0
  5. atno    1    TW    5.0    1.0    3.0
  6. atno    1    TW    1.0    1.0    1.0
  7. atno    6    TW    5.0    2.0    3.0
  8. atno   11   TW    5.0    1.0    3.0
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2013-11-06 10:52 |显示全部楼层
可能就是这么个简单的意思吧。
  1. awk '{if ($2<n) i++;n=$2;print >FILENAME "_" i+1}' *.dat
复制代码
碰到有$2 比前一行小,就输出到一个新的文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP