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

2

Alguém pode me dar o exemplo de como usar awk ou sed (não tenho certeza qual deles, como eu não usei tanto desses, como eu tenho usado principalmente grep e corte para trabalhar com dados csv) para converter diferenças entre dois arquivos .csv em algo mais legível.

por exemplo. se eu tiver gerado um diff de arquivos .csv antigos e novos, o que em uma vida real poderia ser muito mais complexo devido a um 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 do diff, para identificar a linha. A segunda coluna contém os dados do primeiro arquivo csv (valor antigo) e da terceira coluna - é o valor do segundo arquivo csv (novo valor).

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

Obrigado.

    
por Mitten 05.10.2013 / 07:17

1 resposta

4

Use o awk com dois arrays associativos. Algo parecido com isto:

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 em uma linha separada por espaços, se preferir - mas eu gosto de várias linhas. ;) Aqui está uma amostra:

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ê tem um antigo awk, o "< *" pode precisar ser um padrão fixo em vez de um regex, então perca o * e coloque a quantidade literal de espaços após o indicador direcional.

    
por 06.10.2013 / 21:33