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á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. O1
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 em0
) 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/
. 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.