Unix Truncate Column no arquivo csv

5

Como truncar a coluna "test10" para 5 caracteres da linha de comando do Unix?

A partir disso

test1,test2,test3,test4,test10,test11,test12,test17
rh,mbn,ccc,khj,ee3 eeeeeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a2,3,u
hyt,bb,mb,khj,R ee3ee eeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a,5,r
mbn,htr,ccc,fdf,F1ee eeeeEeee ee$eeee e.eeeee2eeeee5eeeeeeee,a,e,r

Para isso

test1,test2,test3,test4,test10,test11,test12,test17
rh,mbn,ccc,khj,ee3 e,a2,3,u
hyt,bb,mb,khj,R ee3,a,5,r
mbn,htr,ccc,fdf,F1ee ,a,e,r
    
por Mike 29.12.2016 / 16:50

2 respostas

11

Se o seu arquivo é realmente tão simples quanto o seu exemplo, você pode fazer um dos seguintes:

  • awk

    $ awk -F, -vOFS=, 'NR>1{$5=substr($5,1,5)}1' file 
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    Explicação

    O -F, define o separador do campo de entrada como , e o -vOFS=, define a variável OFS (o separador do campo de saída) como , . NR é o número da linha atual, portanto, o script acima mudará o quinto campo para uma subseqüência de 5 caracteres. O 1 solitário é um atalho do awk para "imprimir esta linha".

  • perl

    $ perl -F, -lane '$F[4]=~s/(.{5}).*/$1/ if $.>1; print join ",", @F' file 
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    Explicação

    O -a faz o perl agir como o awk e divide suas linhas de entrada no caractere dado por -F e as salva como elementos da matriz @F . Em seguida, removemos todos, exceto os primeiros 5 caracteres do 5º campo (eles começam a contar em 0 ) e, em seguida, imprimimos a matriz @F resultante associada a vírgulas.

  • sed

    $ sed  -E '1!s/(([^,]+,){4}[^,]{5,5})[^,]*,/,/' file
    test1,test2,test3,test4,test10,test11,test12,test17
    rh,mbn,ccc,khj,ee3 e,a2,3,u
    hyt,bb,mb,khj,R ee3,a,5,r
    mbn,htr,ccc,fdf,F1ee ,a,e,r
    

    Explicação

    Este é o operador de substituição cujo formato geral é s/original.replacement/ . O 1! significa "não faça isso na primeira linha". A expressão regular corresponde a um conjunto de não- , seguido por , 4 vezes ( ([^,]+,){4} ) e, em seguida, quaisquer 5 caracteres não- , ( [^,]{5} ) - estes são os primeiros 5 do 5º campo - e depois qualquer outra coisa até o final do campo ( [^,]+, ). Tudo isso é substituído pela primeira parte da linha, truncando efetivamente o campo.

por 29.12.2016 / 17:01
5

Usando o Awk:

$ awk -F "," 'BEGIN { OFS = FS } NR > 1 { $5 = substr($5,1,5) } { print }' data.csv

O sinalizador -F define o separador do campo de entrada e o bloco BEGIN define o separador do campo de saída como qualquer separador de campo de entrada (uma vírgula).

Se o número ordinal do registro atual ( NR ) for maior que um (ou seja, tivermos passado a linha de cabeçalho), a função substr() truncará o quinto campo (coluna) para no máximo cinco caracteres . Isso evita modificar a primeira linha dos dados de entrada.

O lone print imprimirá o registro (possivelmente) modificado (linha) na saída padrão.

    
por 29.12.2016 / 17:00