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.