Tenho um arquivo CSV sem cabeçalho que é classificado na primeira coluna. Quando a 2ª e a 3ª colunas são idênticas, quero "recolhê-las" em uma - ou seja, deixar a última coluna vazia. Em outras palavras, isto:
0000001,11111,66666
0000002,12121,22222
0000003,33333,33333
0000004,74747,44444
0000005,12345,12345
...se torna isto:
0000001,11111,66666
0000002,12121,22222
0000003,33333,
0000004,74747,44444
0000005,12345,
Eu tentei várias permutações de grep
and cut
mas não consegui fazer nada funcionar - o mais próximo que cheguei foi cut -c 8-19 file.csv
, que apenas isola a 2ª e a 3ª colunas. Tenho a sensação de que precisar fazer isso em colunas e precisar excluir o valor em vez da linha inteira torna isso complicado o suficiente para exigir awk
or sed
, e eu não sei o suficiente sobre nenhum dos dois para saber como abordar isso.
Isto
awk
(com qualquer distribuição) deve funcionar para você:No GNU
awk
com seus exemplos mostrados, tente o seguinte código. Usandomatch
a função com regex(^[^,]+,)([^,]+)(,)([^,]+)(.*$)
e usando sua capacidade de salvar valores correspondentes em grupos de captura que estão sendo usados para verificação posterior e impressão conforme a necessidade.Usando
sed
Isso pode funcionar para você (GNU sed):
Faça a correspondência de padrões entre a segunda e a terceira colunas e substitua pela segunda coluna.
Eu aproveitaria o GNU
AWK
para esta tarefa da seguinte maneira: deixefile.txt
o conteúdo serentão
dá saída
Explicação: Informo ao GNU
AWK
que a vírgula é tanto um separador de campo (FS
) quanto um separador de campo de saída (OFS
), então componho a linha usando o chamado operador ternário com a condição de que o 2º campo seja igual ao 3º campo, o valor se verdadeiro sendo uma string vazia e o valor se falso sendo o 3º conteúdo do campo.(testado no GNU Awk 5.0.1)