En realidad, esto se puede hacer en Bash sin usar ningún programa externo (los scripts que usan esto deben comenzar con #!/bin/bash
en lugar de #!/bin/sh
y no será compatible con shell POSIX) usando la expresión ${VARIABLE:offset:length}
(donde :length
es opcional):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
tendrá esta salida:
1
12345
123456789
6789
9
Tenga en cuenta que el desplazamiento de inicio comienza en cero y la longitud debe ser al menos uno. También puede compensar desde el lado derecho de la cadena utilizando un desplazamiento negativo entre paréntesis:
echo ${STR:(-5):4}
5678
Para leer un archivo, obtenga los primeros 8 caracteres repetidamente para cada línea e imprímalos en la terminal, use un while
bucle como este:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
Un recurso extremadamente útil para todo lo que necesita saber sobre la manipulación de cadenas de Bash está aquí:https://tldp.org/LDP/abs/html/string-manipulation.html
Con cut
:
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
Si entiendo el segundo requisito, desea dividir los primeros 22 caracteres en dos columnas de 10 y 12 de longitud. sed
es la mejor opción para esto:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
sudo_O ha proporcionado una buena solución de corte y sed, acabo de agregar una sola línea awk:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
con caracteres vacíos (depende de sus requisitos, desea omitir los espacios o desea incluirlos y contarlos en su salida)
si los espacios en blanco también deben contarse y mostrarse en la salida:(no tiene que cambiar el cmd anterior)
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
si desea omitir esos espacios:(rápido y sucio)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001