
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[^=]*/g
que se lee como "obténme la serie denon=
caracteres a cuya izquierda se ve un espacio en blanco horizontal\h
o el comienzo de una línea"^
. Luego, estos se imprimen usando elOFS
$,
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
/="([^"]*)"/g
que 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 unestdout
con el archivoOFS
. - En el caso de la
while
solució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 laexpr
utilidad para desarrollar el valor entre comillas dobles y colocarlas en la$@
matriz. Al final delfor
ciclo 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$*
.