Estoy buscando escribir un script que tome un .txt
filename como argumento, lee el archivo línea por línea y pasa cada línea a un comando. Por ejemplo, ejecuta el comando command --option "LINE 1"
, luego command --option "LINE 2"
, etc. La salida del comando se escribe en otro archivo. ¿Cómo hago para hacer eso? No sé por dónde empezar.
Respuesta aceptada:
Usa while read
bucle:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Otra es redirigir la salida por bloque:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Lo último es abrir el archivo:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Si uno de los comandos lee la entrada, sería una buena idea usar otro fd para la entrada para que los comandos no lo coman (aquí asumiendo que ksh
, zsh
o bash
para -u 3
, usa <&3
en lugar portable):
while IFS= read -ru 3 LINE; do
...
done 3< file
Finalmente para aceptar argumentos, puedes hacer:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
¿Cuál podría ejecutarse como:
bash script.sh file another_file
Idea adicional. Con bash
, usa readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Nota:IFS=
se puede omitir si no le importa tener los valores de línea recortados de los espacios iniciales y finales.