sustituir script reemplazar linea leer insertar fichero especiales eliminar comando caracteres caracter añadir shell unix awk

shell - script - Cómo agregar 100 espacios al final de cada línea de un archivo en Unix



sed eliminar caracter (7)

Tengo un archivo que se supone que contiene 200 caracteres en cada línea. Recibí un archivo fuente con solo 100 caracteres en cada línea. Necesito agregar 100 espacios en blanco adicionales a cada línea ahora. Si hubiera pocos espacios en blanco, podríamos haber usado sed como:

sed ''s/$/ /'' filename > newfilename

Dado que son 100 espacios, ¿alguien puede decirme si es posible agregarlo a Unix?


Con awk

awk ''{printf "%s%100s/n", $0, ""}'' file.dat

$0 refiere a toda la línea.


En caso de que estés buscando una solución bash ,

while IFS= read -r line do printf "%s%100s/n" "$line" done < file > newfile

Prueba

Digamos que tengo un archivo con 3 líneas, como

$ wc -c file 16 file $ wc -c newfile 316 newfile

Respuesta original

spaces=$(echo {1..101} | tr -d 0-9) while read line do echo -e "${line}${spaces}/n" >> newfile done < file


Otra forma en GNU awk usando la función de manipulación de cadenas sprintf .

awk ''BEGIN{s=sprintf("%-100s", "");}{print $0 s}'' input-file > file-with-spaces

Una prueba con un ejemplo:

$ cat input-file 1234jjj hdhyvb 1234jjj 6789mmm mddyss skjhude khora77 koemm sado666 nn1004 nn1004 457fffy $ wc -c input-file 92 input-file $ awk ''BEGIN{s=sprintf("%-100s", "");}{print $0 s}'' input-file > file-with-spaces $ wc -c file-with-spaces 492 file-with-spaces


Puedes usar printf en awk :

awk ''{printf "%s%*.s/n", $0, 100, " "}'' filename > newfile

Este printf agregará 100 espacios al final de cada nueva línea.


Si desea tener n caracteres fijos por línea (no confíe en que el archivo de entrada tenga m caracteres exactos por línea) siga esto. Para el archivo de entrada con número variable de caracteres por línea:

$ cat file 1 12 123 1234 12345

extender a 10 caracteres por línea.

$ awk ''{printf "%-10s/n", $0}'' file | cat -e 1 $ 12 $ 123 $ 1234 $ 12345 $

Obviamente cambia de 10 a 200 en tu script. Aquí $ muestra el final de la línea, no está allí como un personaje. No necesita cat -e , aquí solo para mostrar que la línea está extendida.


Si usa Bash, aún puede usar sed, pero use algunas funcionalidades de lectura para evitar que escriba manualmente 100 espacios (consulte el manual "Argumentos de Readline" ).

Empiezas a escribir normalmente:

sed ''s/$/

Ahora, quieres insertar 100 espacios. Puede hacer esto al antepender presionando la barra espaciadora con un argumento de lectura para indicar que quiere que suceda 100 veces, es decir, ingresa manualmente lo que se vería así como un enlace de línea de lectura:

M-1 0 0 /040

O bien, si su clave meta es la tecla alt: Alt + 1 0 0 Espacio

Esto inserta 100 espacios, y obtienes

sed ''s/$/ /'' filename

después de escribir el resto del comando.

Esto es útil para trabajar en un shell interactivo, pero no es muy bonito para los scripts; use cualquiera de las otras soluciones para eso.


Actualizado después de la sugerencia de Glenn

De alguna manera, como Glenn sugiere en los comentarios, la sustitución es innecesaria, puede agregar los espacios, aunque, siguiendo esa lógica aún más, ni siquiera necesita la suma, puede say después de la línea original.

perl -nlE ''say $_," "x100'' file

Respuesta original

Con Perl:

perl -pe ''s/$/" " x 100/e'' file

Eso dice ... "Sustituir ( s ) el final de cada línea ( $ ) con la expresión calculada ( e ) de 100 repeticiones de un espacio" .

Si quisiera rellenar todas las líneas, por ejemplo, con 200 caracteres, incluso si el archivo de entrada estaba deshilachado (todas las líneas de diferente duración), podría usar algo como esto:

perl -pe ''$pad=200-length;s/$/" " x $pad/e''

que formaría líneas de 83, 102 y 197 caracteres a 200 cada uno.