Tengo un archivo de texto que contiene un nombre de archivo en cada línea:
111_c4l5r120.png
123_c4l4r60.png
135_c4l4r180.png
147_c4l3r60.png
15_c4l1r120.png
...
Quiero convertirlo de esta forma:
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
...
usando este código:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line" >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"
pero el resultado es:
111_c4l5r120.png
111
123_c4l4r60.png
123
135_c4l4r180.png
135
147_c4l3r60.png
147
15_c4l1r120.png
15
...
¿Cómo debo cambiar mi script para tener el resultado deseado?
shell
shell-script
Ali
fuente
fuente
Respuestas:
A menos que tenga una necesidad específica de usar el shell para esto, la respuesta de terdon proporciona mejores alternativas.
Como está usando
bash
(como se indica en el shebang del script), puede usar la-n
opción para hacer eco:O puede usar las funciones de shell para procesar la línea sin usar
cut
:(reemplazando ambas
echo
líneas).Alternativamente,
printf
también funcionaría, funciona en cualquier shell POSIX y generalmente es mejor (vea ¿Por qué es printf mejor que echo? Para más detalles):o
(Estrictamente hablando, en términos simples
/bin/sh
,echo -n
no es portátil . Ya que está usando explícitamentebash
, está bien aquí).fuente
¡No hagas este tipo de cosas en la cáscara! Es mucho más complejo de lo necesario, propenso a errores y mucho, mucho más lento. Hay muchas herramientas diseñadas para tal manipulación de texto. Por ejemplo, en
sed
(aquí suponiendo implementaciones recientes de GNU o BSD para-E
):O, para cualquier
sed
:Perl:
awk:
fuente
sed
en unosed 's/\([^_]*\).*/& \1/' file
para una portabilidad adicional. El punto es que puedes contarawk
ysed
estar allí más de lo que puedes contar con casi cualquier otra cosa.Aquí estás:
Salida:
fuente