1

私のテキストファイルの出力は、2行で次のようになります。

DelayTimeThreshold|MaxDelayPerMinute|Name
10000|5|rca

私の望む出力はあまりにもこのように見えます:

DelayTimeThreshold 10000
MaxDelayPerMinute 5
Name rca

私はこれを試してもうまくいきません:

sed '$!N;s/|/\n/' foo

どんなアドバイスでも大歓迎です、ありがとう。

4

5 に答える 5

1

2行しかないので、これは方法になる可能性があります:

$ paste -d' ' <(head -1 file | sed 's/|/\n/g') <(tail -1 file | sed 's/|/\n/g')
DelayTimeThreshold 10000
MaxDelayPerMinute 5
Name rca

バラバラに。|最初の行を取得して、すべてのパイプを新しい行に置き換えましょう。

$ head -1 file | sed 's/|/\n/g'
DelayTimeThreshold
MaxDelayPerMinute
Name

そして、最後の行で同じことを行います:

$ tail -1 file | sed 's/|/\n/g'
10000
5
rca

次に、区切り文字としてスペースを使用して両方の結果を貼り付けるだけです。

paste -d' ' output1 output2
于 2013-11-11T16:37:23.080 に答える
1

Array::Transposeモジュールの使用:

perl -MArray::Transpose -F'\|' -lane '
    push @a, [@F]
    } END {print for map {join " ", @$_} transpose(\@a)
' <<END
DelayTimeThreshold|MaxDelayPerMinute|Name
10000|5|rca
END
DelayTimeThreshold 10000
MaxDelayPerMinute 5
Name rca
于 2013-11-11T17:17:18.620 に答える
1

この awk ワンライナーは、要件に適しています。

awk -F'|' '!f{gsub(/\||$/," %s\n");f=$0;next}{printf f,$1,$2,$3}' file

出力:

kent$ echo "DelayTimeThreshold|MaxDelayPerMinute|Name
10000|5|rca"|awk -F'|' '!f{gsub(/\||$/," %s\n");f=$0;next}{printf f,$1,$2,$3}'  
DelayTimeThreshold 10000
MaxDelayPerMinute 5
Name rca
于 2013-11-11T16:58:44.807 に答える
0

perl スクリプトとして:

#!/usr/bin/perl -w
use strict; 
use Data::Dumper;

my $file1 = ('DelayTimeThreshold|MaxDelayPerMinute|Name');
my $file2 = ('10000|5|rca');

my @file1 = split('\|', $file1);
my @file2 = split('\|', $file2);

my %hash;

@hash{@file1} = @file2;

print Dumper \%hash;

出力:

$VAR1 = {
          'Name' => 'rca',
          'DelayTimeThreshold' => '10000',
          'MaxDelayPerMinute' => '5'
        };

また:

for (my $i = 0; $i < $#file1; $i++) {
    print "$file1[$i] $file2[$i]\n";
}

出力:

DelayTimeThreshold 10000
MaxDelayPerMinute 5
Name rca
于 2013-11-11T16:46:37.940 に答える