Como usar o awk ou sed para converter diffs csv em um formato mais legível

Como usar o awk ou sed para converter diffs csv em um formato mais legível

Alguém pode me dar um exemplo de como usar o awk ou o sed (não tenho certeza de qual, pois não uso muito nenhum deles, pois tenho usado principalmente grep e cut para trabalhar com dados csv) para converter diferenças entre dois .csv em algo mais legível.

por exemplo, se eu gerei uma comparação entre arquivos .csv antigos e novos, o que na vida real poderia ser muito mais complexo devido ao grande número de colunas:

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

como eu poderia convertê-lo para este formato:

Barbara  1093 1011 
Magdaline 2093 12093

em um novo formato - uma primeira coluna de dados é um valor da primeira coluna em ambas as partes da comparação, para identificar a linha. A segunda coluna contém os dados do primeiro arquivo csv (valor antigo) e a terceira coluna - é o valor do segundo arquivo csv (novo valor).

Como posso realizar essa conversão de texto via awk ou sed?

Obrigado.

Responder1

Use awk com dois arrays associativos. Algo assim:

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

Você pode concatenar tudo isso em uma linha separada por espaços, se preferir - mas eu gosto de várias linhas. ;) Aqui está um exemplo:

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

Ah, se você tiver um awk antigo, "< *"pode ser necessário um padrão fixo em vez de um regex, então perca *e coloque a quantidade literal de espaços após o indicador direcional.

informação relacionada