Eu me deparei com uma pergunta (no próprio SO) em que o OP precisa editar e salvar a operação no próprio Input_file (s).
Sei por um único arquivo Input_file que poderíamos fazer o seguinte:
awk '{print "test here..new line for saving.."}' Input_file > temp && mv temp Input_file
Agora, digamos que precisamos fazer alterações no mesmo tipo de formato de arquivo (assuma .txt aqui).
O que tentei / pensei para este problema: Sua abordagem é passar por um loop for de arquivos .txt e chamar singleawké um processo doloroso e NÃO recomendado, pois desperdiçará ciclos desnecessários da CPU e, para um número maior de arquivos, seria mais lento.
Então, o que possivelmente poderia ser feito aqui para executar edição no local de vários arquivos com um NON GNU awkque não suporta a opção inplace. Também passei por esse segmento. Salvar modificações no local com o awk, mas não há muito para o vice NÃO do GNU awk e alterar vários arquivos no local awk, pois um awk não GNU não terá inplaceopção.
OBSERVAÇÃO: Por que estou adicionandobashtags, desde que, na parte de resposta, usei os comandos bash para renomear arquivos temporários para seus nomes reais de Input_file, adicionando-os.
EDIT: De acordo com o comentário de Ed sir, adicionando um exemplo de amostras aqui, embora a finalidade do código deste segmento também possa ser usada por edição genérica no local.
Arquivos de entrada de amostra:
cat test1.txt
onetwo three
tets testtest
cat test2.txt
onetwo three
tets testtest
cat test3.txt
onetwo three
tets testtest
Amostra da saída esperada:
cat test1.txt
1
2
cat test2.txt
1
2
cat test3.txt
1
2
awk(talvez em um subshell) ou um {...}grupo fechado e depois gravar os resultados no arquivo de saída desejado (para cada arquivo de entrada, ou um arquivo combinado para todos os arquivos de entrada). Então você simplesmente redireciona a saída do subshell ou grupo de chaves para o arquivo atual que está sendo gravado? Simplesmente incluir uma sequência de arquivos de entrada após o awkcomando processaria sequencialmente todos os arquivos (ou algo semelhante)?
awk {..} file1 .. fileXescrever o arquivo modificado, como, por exemplo, temp01e em sua próxima iteração ao processar o próximo arquivo, use a mv -f tmp01 input01para sobrescrever o arquivo de entrada com os dados modificados; ou (2) basta escrever um novo diretório ./tmp/tmp01 ... ./tmp/tmp0Xdurante a execução do awkscript e acompanhar com um loop sobre os arquivos no ./tmpdiretório e, por exemplo mv -f "$i" "input_${i##*[^0-9]}"(ou qualquer expansão necessária para substituir os arquivos de entrada antigos)
awka conclusão completa do código, a segunda opção é quase a mesma que eu estou usando na minha sugestão. fique agradecido se você puder informar seus pensamentos sobre essa solução, senhor.