GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo obtener los primeros n caracteres de cada línea en un archivo de datos de Unix

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

Linux
  1. ¿Cómo insertar texto antes de la primera línea de un archivo?

  2. ¿Cómo limpiar las extensiones de archivo?

  3. ¿Cómo hacer cada selección de menú en 1 línea en lugar de selecciones múltiples en 1 línea?

  4. ¿Cómo analizar cada línea de un archivo de texto como un argumento para un comando?

  5. Cómo contar líneas en un archivo en UNIX/Linux

Cómo leer un archivo línea por línea en Bash

Cómo convertir un archivo de Windows a un archivo UNIX

Cómo hacer eco en un archivo

Cómo agregar una cadena de fecha a cada línea de un archivo de registro escrito continuamente

¿Cómo agrego texto a un archivo?

obtenga los primeros 5 caracteres de cada línea en el script de shell