Pregunta Repetición manual de una línea de un archivo | intento


Podría hacer esto en cualquier otro idioma, pero con Bash he buscado mucho y no he podido encontrar la respuesta.

Necesito aumentar manualmente $line en un guion Ejemplo:

for line in `cat file`
do
foo()
       foo_loop(condition)
{
 do_something_to_line($line) 
}
done

Si nota, cada vez que foo_loop itera, $line Se mantiene igual. Necesito iterar $line allí, y asegúrese de que el bucle original for solo ejecuta el número de líneas en el archivo.

He pensado en encontrar el número de líneas en el archivo usando un ciclo diferente e iterando la variable de línea dentro del ciclo interno de foo().

¿Algunas ideas?

EDITAR:

Perdón por ser tan vago.

Aquí vamos:

Estoy tratando de hacer que una sección de mi código se ejecute varias veces (ejecución paralela)

Function foo() # Does something
for line in `cat $temp_file`;
foo($line)

Ese código funciona bien, porque foo solo está tomando el valor de la línea; pero si quisiera hacer esto:

Function foo() # Does something
for line in `cat $temp_file`;
while (some condition)
foo($line)
end

$line igualará el mismo valor en todo el ciclo while. Necesito que cambie con el while loop, luego continúe cuando vuelva a la for. Ejemplo:

line = Hi
foo{ echo "$line" }; 
for line in `cat file`;
while ( number_of_processes_running -lt max_number_allowed)
foo($line)
end

Si el contenido del archivo fuera

Hi \n Bye \n Yellow \n Green \n

El resultado del programa de ejemplo sería (si el número máximo permitido fuera 3)

Hi Hi Hi Bye Bye Bye Yellow Yellow Yellow Green Green Green.

Donde quiero que sea

Hi Bye Yellow Green 

Espero que esto sea mejor Estoy haciendo mi mejor esfuerzo para explicar mi problema.


8
2017-09-21 19:54


origen


Respuestas:


En lugar de usar un bucle for para leer el archivo, tal vez deberías leer el archivo como ese.

#!bin/bash

while read line
do
    do_something_to_line($line)
done < "your.file"

16
2017-09-21 20:16



Larga historia corta, while read line; do _____ ; done

Luego, asegúrese de tener comillas dobles alrededor de "$ line" para que un parámetro no esté delimitado por espacios.

Ejemplo:

$ cat /proc/cpuinfo | md5sum
c2eb5696e59948852f66a82993016e5a *-

$ cat /proc/cpuinfo | while read line; do echo "$line"; done | md5sum
c2eb5696e59948852f66a82993016e5a *-

Segundo ejemplo     # agregar .gz a cada archivo en el directorio actual:     # Si algún archivo tiene espacios, el comando mv para esa línea devolverá un error.

$ find -type f -maxdepth 1 | while read line; do mv "$line" "$line.gz"; done

6
2017-09-21 20:17



Debe publicar seguimientos como ediciones a su pregunta o en comentarios en lugar de como respuesta.

Esta estructura:

while read line
do
    for (( i=1; i<$max_number_allowed; i++ ))
    do
        foo $line
    done
done < file

Rendimientos:

Hola
Hola
Hola
Adiós
Adiós
Adiós
... etc.

Mientras este:

for (( i=1; i<$max_number_allowed; i++ ))
do
    while read line
    do
        foo $line
    done < file
done

Rendimientos:

Hola
Adiós
Amarillo
Verde
Hola
Adiós
Amarillo
Verde
... etc.

1
2017-09-21 21:00