#linux #bash #perl #sed #awk
После работы некоторого скрипта, в файл записывается примерно следующее:
1 ---> something
2 ---> something
3 ---> something
...
18254 --> something
Бывает такое, что в виду того, что я использую в скрипте старый добрый eval, который
помогает мне, чтобы прога не упала на какой-либо ошибке, то какой-нибудь запрос (пусть
это будет 4205) может не записаться в файл:
Покажу на примере:
...
4200 ---> something
4201 ---> something
4202 ---> something
4203 ---> something
4204 ---> something
4206 ---> something
Вопрос: как проверить, какого номера строки (или просто, какого номера нет в файле)
нет в файле? И возможно ли?
Ответы
Ответ 1
Можно сделать как-то так: awk -v var="$((`head -n 1 file | awk '{print $1}'`))" 'BEGIN {p=var} {for(i=p+1; i<$1; i++) print i} {p=$1}' file Результат будет: 4205 Сначала мы забираем первое число, которое у нас есть в файле. Если этого не делать, то счет будет с 1. Просто у вас из вопроса не ясно, с какого числа начинается счет. Потом через awk мы просто проверяем последовательность чисел. И если числа нет, то выводим его на экран. Для случая, если ВСЕГДА последовательность чисел начинается с 1 awk '{for(i=p+1; i<$1; i++) print i} {p=$1}' fileОтвет 2
seq $(grep -oP '^\d+' input.txt | tail -1) | diff - <(grep -oP '^\d+' input.txt) | grep '<' Сперва находим последнюю пронумерованную строку (grep -oP '^\d+' input.txt | tail -1) Далее создаем последовательность без потери чисел (seq см.предыдущее) Сравниваем полученную последовательность с той, что имеется в файле (см. предыдущее | diff - <(grep -oP '^\d+' input.txt) Выводим отсутствующие числа (см. предыдущее | grep '<') Команду grep -oP '^\d+' input.txt можно вывести в переменную, чтобы не тратиться на повторное чтение данных из файла. В случае поиска отсутствия диапазонов чисел лучше использовать awk. Дополнение # заносим номера строк в переменную n=($(grep -oP '^\d+' input.txt)) # выводим различия целочисленных последовательностей echo $(seq ${n[-1]}) ${n[@]} | tr ' ' '\n' | sort -n | uniq -u
Комментариев нет:
Отправить комментарий