Удалить последнее x-количество строк в txt-файле, если он содержит символы, в bash

Раствор перла:

perl -lane 'substr $n = $F[2], $F[3] - 1, 1, $F[5]; print join "\t", $_, $n' -- file
  • -nсчитывает ввод построчно
  • -lудаляет новые строки из ввода и добавляет их в print s
  • -aразбивает каждую строку по пробелу в массив @F
  • подробности см. в substr

0
16.01.2020, 23:40
3 ответа

Попробуйте

tac file | awk '/[[:alpha:]]/ && ++CNT <= 50 {next} 1' | tac

или

tac file | awk '/[[:alpha:]]/ && NR <= 50 {next} 1' | tac

Сначала проверим, содержат ли последние строки буквы, и, если да, посчитаем 50 из них и выкинем ==> выкинуты ровно 50 строк. Второй проверит 50 строк и, если содержит буквы, выкинет ==> меньше или равно 50 выкинутых строк.

1
28.01.2020, 02:29

Вы сказали, что это файл, используйте редактор файлов.

for f in *.txt; do
  printf '%s\n' '-49,$g/pattern/d' w | ed -s "$f"
done

Предполагая, что файлы не пусты, это должно работать, в противном случае добавьте тест внутри цикла, если файл пуст, и игнорируйте/пропускайте его. Это решение фактически отредактирует файлы на месте, поэтому протестируйте некоторые образцы файлов и сначала создайте резервную копию, потому что оно удалит строки с patternиз последних 50 строк.

0
28.01.2020, 02:29

Если шаблон для поиска в последних 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 {} +
1
28.01.2020, 02:29

Теги

Похожие вопросы