Se bem entendi, você deseja fazer o seguinte para cada arquivo .txt
:
- Localize a primeira linha que contém o padrão
text
.
- Nessa linha, pegue o segundo campo separado por espaço em branco e grave-o em um arquivo cujo nome esteja relacionado ao arquivo de entrada.
Você não está dizendo como o nome do arquivo de saída deve ser construído. Vou fazer o mesmo que o arquivo de entrada, mas terminando em .out
em vez de .txt
.
Você pode fazer isso com um loop de shell.
for x in *.txt; do
grep 'text' -- "$x" | awk '{print $2; exit}' >"${x%.*}.out"
done
Sair do awk assim que estiver pronto, seu trabalho é um pouco mais rápido do que dizer para continuar lendo, mas não fazer nada. Outra possibilidade é ignorar completamente o awk e fazer com que o shell faça a divisão de linha (se isso é mais rápido ou mais lento, depende de muitos fatores que não vou arriscar em previsões):
for x in *.txt; do
grep 'text' -- "$x" | read -r first second rest && printf '%s\n' "$rest" >"${x%.*}.out"
done
Uma abordagem diferente seria fazer todo o trabalho no awk. O awk pode atuar em vários arquivos e você pode usar o redirecionamento do awk para a saída. Isso requer forking menos processos. É bem direto em Gawk (GNU awk):
awk '/text/ {print $2 >substr(FILENAME, 1, length(FILENAME)-4) ".out"; nextfile}' *.txt
Em uma implementação do awk que não possui nextfile
, você precisa manipular manualmente as transições para o próximo arquivo, o que torna essa abordagem menos atraente (mais complexa e menos eficiente).
awk '
FNR==1 {first=1}
first && /text/ {print $2 >substr(FILENAME, 1, length(FILENAME)-4) ".out"; first=0}' *.txt