Acrescentar a campos com condição

1

Entrada:

1,2,20,11
1,1,2018,111

Saída:

1,02,20,11
1,01,18,111

Eu gostaria de inserir 0 no campo número 2, que é o mês, no caso, se for um número único.

E deseja remover os primeiros 2 dígitos do campo número 3, que é o ano, caso sejam 4 números.

    
por αԋɱҽԃ αмєяιcαη 09.06.2018 / 09:25

4 respostas

1

Usando awk :

awk -F, -v OFS=, '                { $2 = sprintf("%02d", $2)   }
                  length($3) == 4 { sub("^[0-9][0-9]", "", $3) } 1' file

Isso reformata incondicionalmente o segundo campo delimitado por vírgula em um inteiro de dois dígitos preenchido com zero. Se o terceiro campo tiver quatro caracteres, seus dois primeiros dígitos serão removidos. O registro resultante é então impresso.

    
por 09.06.2018 / 09:52
1

usando awk :

awk -F, '{ printf("%d,%02d,%d\n" ,$1, $2, substr($3, length($3)-1) ) }' infile
  • length($3) retorna o comprimento da coluna3; -1 é usado para permitir que substr($3, START[, LEN]) comprimento de retorno dos caracteres LEN inicie na segunda posição do último dígito como START (que é length($3)-1 agora). se o LEN for omitido, o restante de START será usado.

EDiT para a questão revisada ( agora 4 colunas ):

awk -F, '{
    printf("%d,%02d,%d%s\n" ,$1, $2, substr($3, length($3)-1), ($4?","$4:"") )
}' OFS= infile

para casos gerais em que N número de colunas ( pelo menos 3 ):

awk -F, '{
     printf("%d,%02d,%d" ,$1, $2, substr($3, length($3)-1) ) }
{ $1=$2=$3=""; printf ("%s\n", (NF>3?","$0:"") ) }' OFS= infile
    
por 09.06.2018 / 10:08
0
input file

1,2,20,11
1,1,2018,111

comando

awk -F ',' '{if(length($2)==1)$2="0"$2;print $0}' inputfile | awk '{if(length($3)==4)$3=substr($3,3,2);print $0}'| sed 's/ /,/g'

saída

1,02,20,11
1,01,18,111
    
por 10.06.2018 / 09:53
0

Uma maneira de lidar com esse cenário é a seguinte:

comando

perl -pe 's|^\d+,\K(\d)?(\d),(\d\d)(\d\d)?(?=,)|($1//0)."$2,".($4//$3)|e' input.txt

Resultado

1,02,20,11
1,01,18,111

Explicação:

s|
^\d+,\K (?# keep the first comma separated field to your left)

(?# $1 $2) (\d)?(\d), (?# maybe a number followed by a definite number)

(?# $3 $4) (\d\d)(\d\d)? (?# two numbers followed maybe by two more)

(?=,) (?# we should see a comma to our right)

|($1//0)."$2,".($4//$3)|e

($1 // 0) means use 0 in case $1 is undefined, IOW, field two is single digit. ($4 // $3) means use $3 in case $4 is undefined, IOW, pick either of the doublets depending on the number of digits.

O sinalizador / e no comando s /// tratará o RHS como um código Perl e o avaliará com quaisquer parâmetros fornecidos e colocará o resultado dessa avaliação como o RHS do comando s ///.

    
por 11.06.2018 / 09:57