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 awk
que 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á inplace
opção.
OBSERVAÇÃO: Por que estou adicionandobash
tags, 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 awk
comando processaria sequencialmente todos os arquivos (ou algo semelhante)?
awk {..} file1 .. fileX
escrever o arquivo modificado, como, por exemplo, temp01
e em sua próxima iteração ao processar o próximo arquivo, use a mv -f tmp01 input01
para sobrescrever o arquivo de entrada com os dados modificados; ou (2) basta escrever um novo diretório ./tmp/tmp01 ... ./tmp/tmp0X
durante a execução do awk
script e acompanhar com um loop sobre os arquivos no ./tmp
diretório e, por exemplo mv -f "$i" "input_${i##*[^0-9]}"
(ou qualquer expansão necessária para substituir os arquivos de entrada antigos)
awk
a 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.