Executando awk em cada arquivo encontrado com find, redirecionando o resultado para um novo nome de arquivo

6

Estou tentando obter os resultados de find e, em seguida, executar o awk para imprimir as duas primeiras colunas. Então eu quero redirecionar esses resultados para um novo nome de arquivo para cada arquivo, usando o nome do arquivo existente com um sufixo adicional adicionado ao nome. Arquivos no diretório com a origem original permanecendo como arquivo.txt e os novos arquivos sendo nomeados file-new.txt

Por exemplo:

find -type f -iname "*.txt" -exec awk '{print $1, $2}' {} \;

O que preciso adicionar para fazer isso? Usar o sed seria uma escolha melhor?

    
por Zedexodus 22.08.2015 / 23:28

1 resposta

7

O método mais simples é usar o redirecionamento de saída do awk. O redirecionamento da saída do awk é muito fácil de usar em casos simples: o arquivo é aberto na primeira vez que um redirecionamento é usado e os redirecionamentos subsequentes para o mesmo nome de arquivo usam o descritor de arquivo existente.

Se você quisesse adicionar um sufixo ao nome do arquivo, seria tão fácil quanto

find -type f -iname "*.txt" -exec awk '{print $1, $2 >(FILENAME "-new")}' {} +

Mas você pode fazer uma transformação mais complexa no nome do arquivo (aqui recalculado apenas na primeira linha de cada arquivo de entrada):

find -type f -iname "*.txt" -exec awk '
    FNR==1 {out=FILENAME; sub(/\.[^.]*$/, "-new&", out) || out = out "-new"}
    {print $1, $2 >out}
' {} +
    
por 22.08.2015 / 23:58