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