Chinaunix

标题: 请教利用脚本如何实现以下文件的分割 [打印本页]

作者: gigisor    时间: 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。先谢过。

作者: elu_ligao    时间: 2013-11-05 09:37
回复 1# gigisor


    你上面有重复行么? 还是只看第2列或前3列是否有重复?
作者: yestreenstars    时间: 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]#
复制代码

作者: 关阴月飞    时间: 2013-11-05 10:10
gigisor 发表于 2013-11-05 06:14
我有几千个文件,每个文件的每一行格式均如下:
"每个文件隔若干行会发生重复,从上面示例中第二列的数字的重复即可看出"
文件1:


把重复的规则和可能出现的情况都弄清楚了,才好下手, 一个文件中只会存在一对重复内容,还是不确定? 每对重复的内容都是相邻的么?
作者: yestreenstars    时间: 2013-11-05 10:14
回复 4# 关阴月飞
楼主给的数据太少,确实不好下手,我也只好碰碰运气了~

   
作者: gigisor    时间: 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

我想这样就比较清楚了。
作者: yestreenstars    时间: 2013-11-06 09:04
本帖最后由 yestreenstars 于 2013-11-06 11:26 编辑

回复 6# gigisor
感觉还是说得不是很清楚,有没有可能是这种情况?
1
2
3
1
2
3
A
B
A
B
楼主给多点数据,数据越多,写的脚本才能更匹配~
   
作者: li0924    时间: 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
复制代码

作者: seesea2517    时间: 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
复制代码

作者: rdcwayx    时间: 2013-11-06 10:52
可能就是这么个简单的意思吧。
  1. awk '{if ($2<n) i++;n=$2;print >FILENAME "_" i+1}' *.dat
复制代码
碰到有$2 比前一行小,就输出到一个新的文件。
作者: gigisor    时间: 2013-11-07 05:38
受教了,谢谢版主。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2