Você poderia fazer isso com awk
da seguinte forma:
awk -F\| 'BEGIN {OFS="|"};{$12=substr($12,1,5)};1'
-F
define o separador de campo como |
, em seguida, antes de começar a processar o texto, usamos o bloco BEGIN
para definir o separador do campo de saída ( OFS
) como |
. Em seguida, substituímos o valor no 12º campo pelos 5 primeiros caracteres desse campo para cada registro.
Você pode dar o nome do arquivo para processar como outro argumento na linha de comando, que é o que você provavelmente quer, ou usar isso em um pipeline se você tiver um processo que esteja gerando o arquivo que deseja atualizar.
Obrigado ao Stéphane Chazelas por corrigir alguns problemas que tive e torná-lo mais POSIX-y. Em particular, para corrigir meu índice inicial de 0 a 1. A documentação do GNU inclui a seguinte linha que me deixa escapar do erro:
If start is less than one, substr() treats it as if it was one.
mas 1
é o índice do primeiro caractere, e por isso deve ser usado, especialmente para pessoas que não usam gawk
. Por exemplo, com mawk
:
$ mawk 'BEGIN{print substr("1234567", 0, 5)}'
1234
$ mawk 'BEGIN{print substr("1234567", 1, 5)}'
12345