在unix中重新排列文件行

时间:2014-05-14 05:15:59

标签: perl unix

我有一个格式如下的文件。这是一个片段,原始行超过一百万。

事实 ABC / DEF / GH9j / etc .. 是一行的开头,“;”应该是该行的结尾。

此示例中 line01,line10& line13 很完美;但其他行分散在多行中:

line01: ABC abc_123 (。Y(B2b),. A(sel));

line02: DEF def_456 (。Z(n_2),. in(1b0),

line03:.tstin(sel),. tstmb(DD));

line04: GH9j 3_inst (。Q0(CC3),. Q1(Ee),

第05行:.Q2(p_2),. Q3(cin),

line06:.D0(AA),. D1(rdata [5]),

line07:.D2(gg),。D3(hp),

line08:.SE0(sel),. SE1(sel),

line09:.SE2(pqr),. SE3(AA),. CA(Bb));

第10行: BUF 4PQR (。Y(eE),. A(cC));

第11行: MX2 MnOp (。X(DD),. A(PQR_11),

第12行:.B(trstb),. S0(klm2));

第13行: BUFH 6th_inst (。Zz(AA),. A(B2B));

.......

问。我想重新排列下面的所有行: 一个实例的所有端口应该在一行中(13行应减少到6行)

line01: ABC abc_123 (。Y(B2b),. A(sel));

line02: DEF def_456 (。Z(n_2),. in(1b0),. tstin(sel),. tstmb(DD));

line03: GH9j 3_inst (。Q0(CC3),. Q1(Ee),. Q2(p_2),. Q3(cin),. D0(AA) ),.D1(rdata [5]),. D2(gg),. D3(hp),. SE0(sel),. SE1(sel),。SE2(pqr),. SE3(AA),. CK( Bb));

line04: BUF 4PQR (。Y(eE),. A(cC));

第05行: MX2 MnOp (。X(DD),. A(PQR_11),. B(trstb),. S0(klm2));

line06: BUFH 6th_inst (。Zz(AA),. A(B2B));

4 个答案:

答案 0 :(得分:1)

一个班轮可能有效:perl -pe' chomp unless m/\;/' file.txt - 虽然有数百万行可能需要调整。

这是作为剧本的一个班轮:

#!/usr/bin/env perl

while (<DATA>) {
    chomp unless m/\;/ ;
    print ;
}

__DATA__
ABC abc_123 ( .Y ( B2b ) , .A ( sel ) );
DEF def_456 ( .Z ( n_2 ) , .in ( 1b0 ) ,
.tstin ( sel ) , .tstmb ( DD ) );
GH9j 3_inst ( .Q0 ( CC3 ) , .Q1 ( Ee ) ,
.Q2 ( p_2 ) , .Q3 ( cin ) ,
.D0 ( AA ) , .D1 ( rdata[5] ) ,
.D2 ( gg ) , .D3 ( hp ) ,
.SE0 ( sel ) , .SE1 ( sel ) ,
.SE2 ( pqr ) , .SE3 ( AA ) , .CK ( Bb ) );
BUF 4PQR ( .Y ( eE ) , .A ( cC ) );
MX2 MnOp ( .X ( DD ) , .A ( PQR_11 ) , 
.B ( trstb ) , .S0 ( klm2 ) );
BUFH 6th_inst ( .Zz ( AA ) , .A ( B2B ) );

<强>输出:

ABC abc_123 ( .Y ( B2b ) , .A ( sel ) );
DEF def_456 ( .Z ( n_2 ) , .in ( 1b0 ) ,.tstin ( sel ) , .tstmb ( DD ) );
GH9j 3_inst ( .Q0 ( CC3 ) , .Q1 ( Ee ) ,.Q2 ( p_2 ) , .Q3 ( cin ) ,.D0 ( AA ) , .D1 (  rdata[5] ) ,.D2 ( gg ) , .D3 ( hp ) ,.SE0 ( sel ) , .SE1 ( sel ) ,.SE2 ( pqr ) , .SE3 ( AA ) , .CK ( Bb ) );
BUF 4PQR ( .Y ( eE ) , .A ( cC ) );
MX2 MnOp ( .X ( DD ) , .A ( PQR_11 ) ,.B ( trstb ) , .S0 ( klm2 ) );
BUFH 6th_inst ( .Zz ( AA ) , .A ( B2B ) );

如果您需要保留行号(line01:),请在问题中添加相应的注释。

答案 1 :(得分:1)

这是一个sed解决方案:

sed -n 'H;/;/{s/.*//;x;s/\n//g;p;}' filename

答案 2 :(得分:1)

如果没有看到你的整个数据集,或者至少有大量的数据集,很难知道要匹配的模式,但是在你给出的例子中,似乎你要合并的行以a换行结束简单地改变,换行,可能会做到这一点:

sed -e ':begin;$!N;s/,\n/,/;tbegin;P;D' in.txt

输出:

ABC abc_123 ( .Y ( B2b) , .A ( sel));
DEF def_456 ( .Z ( n_2) , .in ( 1b0) ,.tstin ( sel) , .tstmb ( DD));
GH9j 3_inst ( .Q0 ( CC3) , .Q1 ( Ee) ,.Q2 ( p_2) , .Q3 ( cin) ,.D0 ( AA) , .D1 ( rdata [5]) ,.D2 ( gg) , .D3 ( hp) ,.SE0 ( sel) , .SE1 ( sel) ,.SE2 ( pqr) , .SE3 ( AA) , .CK ( Bb));
BUF 4PQR ( .Y ( eE) , .A ( cC));
MX2 MnOp ( .X ( DD) , .A ( PQR_11) ,.B ( trstb) , .S0 ( klm2));
BUFH 6th_inst ( .Zz ( AA) , .A ( B2B));

有关在sed中匹配换行符的详细信息,请参阅http://backreference.org/2009/12/23/how-to-match-newlines-in-sed/

答案 3 :(得分:0)

AWK中的单行

awk '{printf "%s%s", $0, /;\s*$/ ? "\n" : " "}' filename

它使用分隔符输出每一行,该分隔符是换行符或空格,具体取决于在行尾是否找到;