Попробуйте
tac file | awk '/[[:alpha:]]/ && ++CNT <= 50 {next} 1' | tac
или
tac file | awk '/[[:alpha:]]/ && NR <= 50 {next} 1' | tac
Сначала проверим, содержат ли последние строки буквы, и, если да, посчитаем 50 из них и выкинем ==> выкинуты ровно 50 строк. Второй проверит 50 строк и, если содержит буквы, выкинет ==> меньше или равно 50 выкинутых строк.
Вы сказали, что это файл, используйте редактор файлов.
for f in *.txt; do
printf '%s\n' '-49,$g/pattern/d' w | ed -s "$f"
done
Предполагая, что файлы не пусты, это должно работать, в противном случае добавьте тест внутри цикла, если файл пуст, и игнорируйте/пропускайте его. Это решение фактически отредактирует файлы на месте, поэтому протестируйте некоторые образцы файлов и сначала создайте резервную копию, потому что оно удалит строки с pattern
из последних 50 строк.
Если шаблон для поиска в последних 50 строках "ШАБЛОН":
find. -maxdepth 1 -type f -name "*.txt" -exec sh -c '
for f do
n=$(($(cat $f|wc -l)-50+1));
[[ $n -lt 1 ]] && n=1;
sed -i "$n,$ {/PATTERN/ d}" $f;
done' sh {} +