Cómo usar awk o sed para convertir diferencias csv a un formato más legible

Cómo usar awk o sed para convertir diferencias csv a un formato más legible

¿Alguien puede darme un ejemplo de cómo usar awk o sed (no estoy seguro de cuál, ya que no he usado mucho ninguno de estos, ya que he estado usando principalmente grep y cut para trabajar con datos csv) para convertir las diferencias entre dos? archivos .csv en algo más legible.

por ejemplo, si generé una diferencia entre archivos .csv nuevos y antiguos, que en la vida real podría ser mucho más complejo debido a la gran cantidad de columnas:

2,3c2,3
< Barbara,1093,19
< Magdaline,2093,20
\ No newline at end of file
---
> Barbara,1011,19
> Magdaline,12093,20
\ No newline at end of file

¿Cómo podría convertirlo a este formato?

Barbara  1093 1011 
Magdaline 2093 12093

en un nuevo formato: una primera columna de datos es un valor de la primera columna en ambas partes de la diferencia, para identificar la línea. La segunda columna contiene los datos del primer archivo csv (valor antiguo) y la tercera columna es el valor del segundo archivo csv (valor nuevo).

¿Cómo puedo realizar dicha conversión de texto mediante awk o sed?

Gracias.

Respuesta1

Utilice awk con dos matrices asociativas. Algo como esto:

awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
'

Puedes concatenar todo eso en una sola línea separada por espacios si lo prefieres, pero a mí me gustan las líneas múltiples. ;) Aquí tienes una muestra:

sauer@humpy:~$ cat file
< a,b,c
> a,d,e
gibberish
< 1,2,3
> 1,4,5
sauer@humpy:~$ awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
' < file
a b d
1 2 4

Oh, si tiene un awk antiguo, es "< *"posible que deba ser un patrón fijo en lugar de una expresión regular, así que pierda el *y coloque la cantidad literal de espacios después del indicador direccional.

información relacionada