Necesidad de formatear la salida en formato csv

Necesidad de formatear la salida en formato csv

Este es el archivo 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"

Necesita una salida en el siguiente formato con abc.csv

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

Respuesta1

Como el formato CSV básico asume una coma ,como separador de campo, utilice el siguiente GNUsedacercarse:

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

La salida:

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

1i- insercionesencabezamientolínea antes de la primera línea del archivo

s/[^=]*="\([^"]*\)"/\1,/g- extraer todos los valores de los atributos

Respuesta2

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

Explicaciones

  • En el código Perl, desde la primera línea extraemos los nombres de los campos a través de la expresión regular /(?:^|\h)\K[^=]*/gque se lee como "obténme la serie de non=caracteres a cuya izquierda se ve un espacio en blanco horizontal \ho el comienzo de una línea" ^. Luego, estos se imprimen usando el OFS $,conjunto de una coma.
  • Para todas las líneas (incluida la primera también), extraemos los valores de campo a través de la expresión regular /="([^"]*)"/gque debe leerse como extraer la cadena encerrada entre comillas dobles (suponiendo que no haya comillas dobles escapadas) que son adyacentes a un signo igual en su izquierda. La colección de estos valores luego se une stdoutcon el archivo OFS.
  • En el caso de la whilesolución de bucle, primero leemos la línea tal como está sin dividir palabras. Luego configuramos el IFS en an =y rechazamos el primer campo. Ahora todos los campos tendrán el formato. "..."...Luego usamos la exprutilidad para desarrollar el valor entre comillas dobles y colocarlas en la $@matriz. Al final del forciclo eliminamos los elementos originales ( $N) luego lo que queda es lo que queremos. Finalmente se unen mediante la coma poniendo IFS en coma y expandiendo $*.

información relacionada