Cria a primeira coluna como cabeçalho e lista seus valores correspondentes usando o shell script

1

Eu tenho um conteúdo de arquivo grande como mostrado abaixo: -

Quantity    20589
Quantity    12297
Quantity    100346
Quantity    0
Quantity    141999
Quantity    23662
Quantity    551071
Quantity    72917
Quantity    60460
Quantity    19712
Quantity    35530
Quantity    0
Quantity    29818
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Price   0
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100
Discount    100

A partir deste arquivo eu quero criar um novo arquivo que deve ter dados como: -

Quantity,Price,Discount
20589,0,100
12297,0,100    
100346,0,100
0,0,100    
141999,0,100
23662,0,100
551071,0,100
72917,0,100
60460,0,100
19712,0,100
35530,0,100
0,0,100
29818,0,100

i.e. leia o arquivo original, o nome da coluna deve ser o cabeçalho do novo arquivo e os valores correspondentes listados conforme mostrado acima.

Por favor me ajude a escrever um novo arquivo usando o shell script.

    
por Chandan Ray 20.06.2016 / 11:50

2 respostas

0

Tudo pode ser feito dentro do comando awk único construindo uma matriz grande com todos os dados, mas se o arquivo for muito grande, você pode ter problemas com a memória disponível. Assim, eu faria isso em várias etapas:

header=$(awk '{print $1}' file | uniq | tr '\n' ',')
printf "${header%?}\n" > output
paste -d, <(awk '$1=="Quantity"{print $2}' file) \
          <(awk '$1=="Price"{print $2}' file) \
          <(awk '$1=="Discount"{print $2}' file) >> output

A única parte complicada aqui é remover a última vírgula no final do cabeçalho. Eu usei o construtor ${par%?} para isso.

    
por 20.06.2016 / 12:38
0

Com o perl você pode ter esse caminho,

#!/usr/bin/perl

use strict;
use warnings;

my $file=$ARGV[0];

open my $fId, '<', $file or die "Error opeining file <$file>.";

my @qty = ();
my @price = ();
my @discount = ();

while(<$fId>){
    chomp;

    my @fields = split (/\t/, $_);

    push @qty      , $fields[1] if $fields[0] =~ m/Quantity/;
    push @price    , $fields[1] if $fields[0] =~ m/Price/;
    push @discount , $fields[1] if $fields[0] =~ m/Discount/;
}
close $fId;

print "Quantity,Price,Discount\n";
for(my $i = 0; $i < scalar @qty; $i++){
    print "$qty[$i],$price[$i],$discount[$i]\n";
}

Você precisará passar o nome do arquivo como argumento.

por exemplo, ./test.pl input_file

    
por 20.06.2016 / 13:31