Me he encontrado con una pregunta (sobre SO) donde OP tiene que hacer operaciones de edición y guardado en Input_file (s).
Sé que para un solo Input_file podríamos hacer lo siguiente:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Ahora digamos que necesitamos hacer cambios en el mismo tipo de formato de archivos (suponga .txt aquí).
Lo que he intentado / pensado para este problema: su enfoque es pasar por un bucle for de archivos .txt y llamar a singleawk
es un proceso doloroso y NO recomendado, ya que desperdiciará ciclos de CPU innecesarios y para una mayor cantidad de archivos sería más lento.
Entonces, ¿qué se podría hacer aquí para realizar la edición in situ para múltiples archivos con un NO GNU awk
que no admite la opción in situ. También he revisado este hilo Guarde las modificaciones en el lugar con awk, pero no hay mucho para el vicio de NON GNU awk y el cambio de múltiples archivos in situ dentro de awk
sí mismo, ya que un no GNU awk no tendrá inplace
opción.
NOTA: ¿Por qué estoy agregandobash
etiquetas ya que, en mi parte de respuesta, he usado comandos bash para cambiar el nombre de los archivos temporales a sus nombres reales de Input_file para agregarlos?
EDITAR: Según el comentario de Ed sir agregando un ejemplo de muestras aquí, aunque el propósito del código de este hilo podría usarse también con la edición in situ con fines genéricos.
Muestra de archivos de entrada:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Muestra de salida esperada:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk
(quizás en una subshell) o un {...}
grupo cerrado y luego escribir los resultados en el archivo de salida deseado (ya sea para cada archivo de entrada, o un archivo combinado para todos los archivos de entrada). Entonces, ¿simplemente redirige la salida de la subshell o grupo encerrado entre llaves al archivo actual en el que se está escribiendo? ¿Simplemente incluir una cadena de archivos de entrada siguiendo el awk
comando procesará secuencialmente todos los archivos (o algo similar)?
awk {..} file1 .. fileX
escribir el archivo modificado como, por ejemplo, temp01
y en su próxima iteración mientras procesa el siguiente archivo, use a mv -f tmp01 input01
para sobrescribir el archivo de entrada con los datos modificados; o (2) simplemente escriba un nuevo directorio ./tmp/tmp01 ... ./tmp/tmp0X
durante la ejecución de la awk
secuencia de comandos y haga un seguimiento sobre los archivos del ./tmp
directorio y, por ejemplo, mv -f "$i" "input_${i##*[^0-9]}"
(o cualquier expansión que necesite para reemplazar los archivos de entrada anteriores.
awk
completar el código completo, la segunda opción es casi lo mismo que estoy usando en mi sugerencia. Le agradecería si pudiera hacer saber sus pensamientos sobre esa solución, señor.