将每个第四行数据移动到上面的四行

时间:2014-03-07 09:02:07

标签: perl sed awk

我有一个可能指数级的文件。我需要每隔4行并将其移到上面四行。

  0   1 BXP_0_1  RRUS11B12  RRU-1    3.2 (35.0)  3.4 (35.4)  1.25 (19.2) 1.11 (25.9)  site_A (15,11)
  0   1 BXP_1_1  RRUS11B12  RRU-2    4.3 (36.3)  3.2 (35.0)  1.26 (18.8) 1.20 (21.0)  site_B (16,10)
  0   1 BXP_2_1  RRUS11B12  RRU-3    4.4 (36.4)  3.1 (34.9)  1.34 (16.7) 1.11 (25.3)  site_C (15,11)
AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C

我希望它看起来像是:

  0   1 BXP_0_1  RRUS11B12  RRU-1    3.2 (35.0)  3.4 (35.4)  1.25 (19.2) 1.11 (25.9)  site_A (15,11) AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
  0   1 BXP_1_1  RRUS11B12  RRU-2    4.3 (36.3)  3.2 (35.0)  1.26 (18.8) 1.20 (21.0)  site_B (16,10) AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
  0   1 BXP_2_1  RRUS11B12  RRU-3    4.4 (36.4)  3.1 (34.9)  1.34 (16.7) 1.11 (25.3)  site_C (15,11) AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C

它会将其关闭,但输出应该全部在线,所以需要这六行并且只给我3行。我需要这样做,因为文件中有许多行。

5 个答案:

答案 0 :(得分:1)

试试这一行,我只是阅读了您使用的数据\s and \S,您可以更改grep中的regex以满足您的需求

paste <(grep '^\s' file) <(grep '^\S' file)

输出:

kent$  paste <(grep '^\s' f) <(grep '^\S' f)                                                                                                                                
  0   1 BXP_0_1  RRUS11B12  RRU-1    3.2 (35.0)  3.4 (35.4)  1.25 (19.2) 1.11 (25.9)  site_A (15,11)    AuxPlugInUnit=RRU-1,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=A
  0   1 BXP_1_1  RRUS11B12  RRU-2    4.3 (36.3)  3.2 (35.0)  1.26 (18.8) 1.20 (21.0)  site_B (16,10)    AuxPlugInUnit=RRU-2,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=B
  0   1 BXP_2_1  RRUS11B12  RRU-3    4.4 (36.4)  3.1 (34.9)  1.34 (16.7) 1.11 (25.3)  site_C (15,11)    AuxPlugInUnit=RRU-3,RiPort=DATA_1 Subrack=1,Slot=1,PlugInUnit=1,RiPort=C

答案 1 :(得分:1)

perl -ne'
  chomp;
  push @r, $_;
  if ($. %3 ==0) { print "$_ ", scalar <> for @r; @r=() }
' file

答案 2 :(得分:0)

与kev类似,我假设你想要合并文件的两半。

计算文件中的行数。然后,将两个打开的文件句柄保存到同一个文件中,其中一个指向开头,第二个指向中间行。然后只需从每个文件句柄中读取一行并打印:

#!/usr/bin/perl
use warnings;
use strict;

my $filename = shift;
open my $IN, '<', $filename or die $!;

1 while (<$IN>);
my $line_count = $.;
die "Odd number of lines.\n" if $line_count % 2;
seek $IN, 0, 0;

open my $SECOND, '<', $filename or die $!;
<$SECOND> for 1 .. $line_count / 2;
for (1 .. $line_count / 2) {
    chomp(my $first = <$IN>);
    print $first, scalar <$SECOND>;
}

用法:perl script.pl data > data.new

答案 3 :(得分:0)

sed -n 's/.*/²&³/
1 {h;b
  }
2,3 {H;b
  }

x;H;g
s/²\([^³]*\)³\(\n\)²\([^³]*\)³\(.*\)/\3 \1\4/
P
s/^[^²]*²/²/
h
' YourFile

需要2个分隔符(任意²³)。只要确保它们不使用char。如果是这种情况并且找不到其他分隔符,则第一个预先操作是在文本中转义分隔符并将其作为后处理放回

答案 4 :(得分:0)

n=$(( $(wc -l < file) / 2 ))
awk -v n=$n 'NR<=n {line[NR]=$0; next} {printf "%s %s\n", line[NR-n], $0}' file