Precisa formatar a saída no formato csv

0

Este é o arquivo abc.txt

NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"
NAME="MARK" StartTime="14:11:26.710583" TotalElapsedTime="0" Pool="10" ThreadsReached="0"

Precisa de uma saída no formato abaixo com abc.csv

NAME    StartTime   TotalElapsedTime    Pool    ThreadsReached
MARK    14:11:26.710583     0       10      0
MARK    14:11:26.710583     0       10      0
    
por Avinash 19.05.2017 / 20:46

2 respostas

1

Como formato CSV básico, a vírgula , como separador de campo usa a seguinte abordagem sed do GNU:

sed -e '1iNAME,StartTime,TotalElapsedTime,Pool,ThreadsReached' -e 's/[^=]*="\([^"]*\)"/,/g; s/,$//g' file

A saída:

NAME,StartTime,TotalElapsedTime,Pool,ThreadsReached
MARK,14:11:26.710583,0,10,0
MARK,14:11:26.710583,0,10,0

1i - insere a linha cabeçalho antes da primeira linha do arquivo

s/[^=]*="\([^"]*\)"/,/g - extraindo todos os valores de atributo

    
por 19.05.2017 / 22:57
0
while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift; N=$#
   for arg
   do
      set -- ${1+"$@"} "$(expr " $arg" : ' "\(.*\)"')"
   done
   shift "$N"; IFS=,; echo "$*"
done < abc.txt

while IFS= read -r l; do
   set -f; IFS==; set -- $l; shift
   while case ${#} in 1 ) break ;; esac; do
      expr " $1" : ' "\(.*\)"'
      shift
   done | tr \n ,; expr " $*" : '.*"\(.*\)"'
done < abc.txt

perl -lne '$,=",";
   print /(?:^|\h)\K[^=]*/g if $. == 1;
   print /="([^"]*)"/g;
' abc.txt

Explicações

  • No código Perl, da primeira linha extraímos os nomes dos campos por meio do regex /(?:^|\h)\K[^=]*/g , que é lido como a execução de non= caracteres em cuja esquerda é visto um espaço em branco horizontal \h ou início da linha ^ . Em seguida, eles são impressos usando o OFS $, definido como uma vírgula.
  • Para todas as linhas (incluindo a primeira também), extraímos os valores do campo por meio da regex /="([^"]*)"/g , que deve ser lida como extrair a string entre aspas duplas (assumindo que não há aspas duplas de escape) que são adjacentes para um sinal de igual à esquerda. A coleção desses valores é então levada para stdout juntado com o OFS .
  • No caso da solução while do loop, primeiro lemos na linha como está sem divisão de palavras. Em seguida, definimos o IFS como = e rejeitamos o primeiro campo. Agora todos os campos terão o formato "..."... Em seguida, usaremos o utilitário expr para detalhar o valor entre aspas duplas e colocá-los na matriz $@ . No final do loop for , removemos os elementos originais ( $N ) e o que resta é o que queremos. Finalmente, eles são unidos pela vírgula por meio da configuração do IFS como vírgula e da expansão de $* .
por 20.05.2017 / 08:12

Tags