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,所以可以这么做:
[root@localhost test]# ls
sse.dat test.dat
[root@localhost test]# head sse.dat test.dat
==> sse.dat <==
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
==> test.dat <==
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
[root@localhost test]# awk '{s=s?s"\n"$0:$0}!(FNR%3){split(FILENAME,a,".");print s > a[1]"-"++b[FILENAME]"."a[2];s=""}' *
[root@localhost test]# ls
sse-1.dat sse-2.dat sse.dat test-1.dat test-2.dat test.dat
[root@localhost test]# head sse-* test-*
==> sse-1.dat <==
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
==> sse-2.dat <==
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
==> test-1.dat <==
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
==> test-2.dat <==
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
[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
看我的可以达到要求不??
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
有没有可能出现这样的情况?即每四行重复一次,但每四行的第一二行是一样的?
atno 1 TW 1.0 1.0 1.0
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 1 TW 1.0 1.0 1.0
atno 6 TW 5.0 2.0 3.0
atno 11 TW 5.0 1.0 3.0
复制代码
作者:
rdcwayx
时间:
2013-11-06 10:52
可能就是这么个简单的意思吧。
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