reorganiza os valores em uma coluna sem afetar outras colunas usando awk ou sed

0

Eu tenho um arquivo csv no seguinte formato:

abc,124,123,2014-08-13,abc
def,124,123,2014-08-13,abc
ghi,124,123,2014-08-13,abc

Agora preciso modificar apenas a quinta coluna ( 2014-08-13 ) para produzir a saída conforme abaixo

abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc

Um liner awk ou sed soluções seria preferido, se possível.

    
por VinothKumar N 13.08.2014 / 11:10

5 respostas

2

Uma solução awk :

awk -F'[,-]' '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}' file

Explicação :

  • -F'[,-] : defina o delimitador como , ou -
  • '{printf "%s,%s,%s,%s/%s/%s,%s\n", $1, $2, $3, $6, $5, $4, $7}' : imprime a peça na ordem desejada e uma nova linha no final.

E uma solução sed :

sed 's|\([0-9]*\)-\([0-9]*\)-\([0-9]*\)|//|g' file

Explicação :

  • \([0-9]*\)-\([0-9]*\)-\([0-9]*\) : pesquisa por dígitos-traço-dígitos-traço-dígitos (salve os dígitos nos subpadrões , e )
  • // e substitua-os na ordem inversa com / no meio.
por 13.08.2014 / 11:16
0

Solução de Perl:

perl -aF'[,-]' -ne 'print join ",", @F[0..2], join("/", @F[5,4,3]), $F[6]' < input
    
por 13.08.2014 / 11:19
0

com sed :

$ sed -e 's#\([0-9]\{1,\}\)-\([0-9]\{1,\}\)-\([0-9]\{1,\}\)#//#' file
abc,124,123,13/08/2014,abc
def,124,123,13/08/2014,abc
ghi,124,123,13/08/2014,abc

Se você tem o GNU ou FreeBSD sed , você pode usar:

sed -E 's#([0-9]+)-([0-9]+)-([0-9]+)#//#' file

ou perl :

perl -pe 's#(\d+)-(\d+)-(\d+)#$3/$2/$1#'
    
por 13.08.2014 / 12:51
0

Outra solução do awk

awk -F, -va="([0-9]+)" '$0=gensub((a"-"a"-"a),"\3/\2/\1","g")' file

-F, Define o separador de campo como vírgula

-va="([0-9]+)" Define uma variável (a) como o regex nas aspas.

([0-9]+) Esta regex corresponde a qualquer número no intervalo de 0 a 9 (portanto, todos os números realmente) e está entre parênteses para que a correspondência seja salva.

$0=gensub Define $ 0 (a linha) como o resultado do gensub

(a"-"a"-"a) Usa a regex de antes para corresponder a 'número' 'traço' 'número' 'traço' 'número'

,"\3/\2/\1","g") Inverte a ordem da correspondência salva e adiciona / entre eles, não que - não estejam entre colchetes e não sejam salvos. g significa que se aplica a todas as correspondências.

    
por 13.08.2014 / 16:22
0

Solução Awk

awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file
    
por 14.08.2014 / 13:20

Tags