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,rExplicação
O
-F,define o separador do campo de entrada como,e o-vOFS=,define a variávelOFS(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. O1solitá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,rExplicação
O
-afaz o perl agir como o awk e divide suas linhas de entrada no caractere dado por-Fe as salva como elementos da matriz@F. Em seguida, removemos todos, exceto os primeiros 5 caracteres do 5º campo (eles começam a contar em0) e, em seguida, imprimimos a matriz@Fresultante 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,rExplicação
Este é o operador de substituição cujo formato geral é
s/original.replacement/. O1!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.