Redirecionamento de múltiplos arquivos com awk e find

1

Eu tenho alguns arquivos em um diretório. E quero adicionar algumas linhas no topo e no final do arquivo usando awk .

Exemplo: Meu comando awk :

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file

Usando o comando acima, posso adicionar line1 & line2 no topo & line3 , line4 no final de file

Agora quero fazer a mesma ação para todos os arquivos existentes no diretório atual.

Se eu usar:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' *

Então eu recebo a saída na tela do terminal, mas eu não posso redirecionar para (ou substituir) todos os arquivos .

Então, tentei seguir (Para find + awk ):

find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' \;

Usando o comando acima eu posso imprimir a saída na tela e, portanto, para sobrescrever arquivos ,

Eu tentei seguir (Para find + awk + sobrescrever com tee ), mas está recebendo erro:

$ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \;
find: missing argument to '-exec'

Assim, como posso usar awk para substituir (ou seja: com |tee ou outra coisa) para todos os arquivos em diretório atual por comando?

    
por Pandya 20.01.2015 / 15:31

2 respostas

6

Com o GNU awk 4.1 ou superior:

find . -type f -exec awk '
   @load "inplace"
   BEGINFILE {
     inplace_begin(FILENAME, "")
     print "line1\nline2"
   }
   {print}
   ENDFILE {
     print "line3\nline4"
     inplace_end(FILENAME, "")
   }' {} +
    
por 20.01.2015 / 15:55
2

Decision1 : Use o GNU sed em vez de awk

sed -i -e '1 i\line1\nline2' -e '$ a\line3\nline4' ./* 

Decision2 : Use o loop para cada arquivo no diretório

for file in ./*
do
  awk '
       BEGIN { print "line1\nline2" }
       { print $0 }
       END { print "line3\nline4" }
      ' "$file" > "$file".tmp &&
    mv -f "$file".tmp "$file"
done
    
por 20.01.2015 / 17:41