将其中具有可变列数的可变行数转置为<pattern>,然后将所有行转置为下一个<pattern>

时间:2019-03-20 08:42:41

标签: perl awk sed text-processing

我有以下与多接口(数十个)网络设备有关的输入(请注意,带有#的行仅作说明,而未出现在数据中):

eth<number1> 
# eth as pattern is fine, running number will be dealt with
parameter1 parameter2 parameter3...parameterN 
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
.
.
.
.
parameterN1 parameterN2  
# again, vertical ellipsis is not literal and means simply that rows 
# with parameters can go on and on, it is not known in advance for 
# how long
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21

所需的输出应如下所示:

eth<number1> parameter1 parameter2 parameterN parameter21 parameter22 parameter31 parameter32 parameter33 parameter34 parameter41 
# all in one line, with as many columns as there are parameters for 
# the given interface.
eth<number2> parameter1 parameter2....parameterNM
eth<number3> parameter1 parameter2
eth<number4> parameter1 parameter2 parameter21

有什么想法最好用awksed完成吗?当然,任何澄清的问题都欢迎。

2 个答案:

答案 0 :(得分:2)

这可能对您有用(GNU sed):

sed -E '/^#/d;/^eth/!{H;$!d};x;s/\n/ /gp;x;h;d' file

存在三种情况:以#开头的行,以eth开头的行和其他行。

如果当前行是注释,则将其删除。

如果当前行没有以eth开始,则将其附加到保留空间(HS)并删除它,除非它是最后一行。

否则,当前行从eth开始或为最后一行,因此请交换到HS,如果其中包含任何换行符,请将其替换为空格并打印结果。交换回图案空间,并用当前行替换HS并删除当前行,除非它是文件的最后一行,否则将其打印出来。

答案 1 :(得分:0)

这在Perl中应该很容易做到。 eth行很容易匹配,我们只想将它们之间的所有行合并为一行。

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

my $collected;
while (my $line = <DATA>){
  next if $line =~ /^#/;
  if($line =~ /^eth/) {
    # new block of lines
    if ($collected) {
      print $collected, "\n";
      $collected = "";
    }
    chomp $line;
    $collected = $line;
  } else {
    # Append to collected lines
    chomp $line;
    $collected = "$collected $line";
  }
}
print $collected,"\n" if $collected;
__DATA__
eth<number1>
parameter1 parameter2 parameter3...parameterN
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
parameterN1 parameterN2
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21

这将解析您的样本数据(忽略注释)并创建所需的输出。当然,这只是一个演示。您想open存放数据的文件并读取它:

open my $fh, "<", "your.data" or die "Can't open file: $!\n";
...
while(my $line = <$fh>) { 
...