Você parâmetros e variáveis de referência com o cifrão , portanto o contador de loop i
pode ser usado como $i
dentro do loop (entre aspas duplas, não aspas simples). Então você só precisa das palavras-chave do
e done
para iniciar e finalizar a parte maluca .
Então, a conversão direta:
> final_output.txt
for (( i = 1 ; i < 23 ; i += 1)); do
grep -w "^sample$i" "file$i.txt" > "sample${i}_file.txt"
cat "sample${i}_file.txt" >> final_output.txt
done
O uso das aspas em torno de "file${i}.txt"
não é estritamente necessário, contanto que i
contenha apenas um número, mas é um bom hábito citar quaisquer referências de variáveis, por vários motivos.
Observe que, no caso de sample${i}_file.txt
, precisamos das chaves em ${i}
, pois o sublinhado é válido em um nome de variável, e a gravação de $i_file.txt
se referiria à variável i_file
.
O% inicial > final_output.txt
é para limpar o arquivo no início, já que o anexamos dentro do loop. Naturalmente, você pode simplesmente ignorar a criação dos arquivos sample1_file.txt
, se não precisar deles, e apenas grep ... >> final_output.txt
.
Como alternativa, você pode usar expansão de contraventamento para gerar uma lista dos números, em vez de contar manualmente com o loop for (( ... ))
, ou seja, for i in {1..22}; do ... done
.
Ou, no shell POSIX padrão:
i=1
while [ "$i" -lt 23 ] ; do
grep ...
i=$((i + 1))
done