Você quer dizer:
BEGIN { flag=0; FS="[^a-zA-Z]+" } {
for (i=1; i<=NF; i++) {
word = tolower($i)
if ($0 ~ /hello/ ) {
if (flag) {
sub ("hello", "hi", word );
}
flag= !flag
}
words[word]++
}
}
END {
for (w in words)
printf("%3d %s\n", words[w], w)
}
O que isso faz é definir um flag para 0 na inicialização do programa awk .
Dentro da iteração do arquivo, ele verifica hello na string de entrada, se hello for encontrado, verificará o estado de flag . Se flag for 0 , não altere hello para hi .
Em seguida, alterne o valor de flag (0 = > 1, 1 = > 0).
Na próxima ocorrência hello , o valor flag será 1 e a substituição de hello a hi será feita.