У меня есть число (позволяет, говорят 13), и я хочу найти, где оно принадлежало бы неполного пронумерованного списка. Вот список в качестве примера:
1
3
4
5
9
16
17
21
Очевидно, эти 13 пошли бы между 9 и этими 16, но как делают меня grep для следующего самого большого количества, учитывая, что у меня есть номер 13. т.е. Как я создал бы grep для 16, учитывая, что я имею 13?
Причина, которую я спрашиваю, состоит в том, потому что я хочу использовать sed или awk для вставки строки на основе поискового параметра, но я не могу выяснить как к grep для нахождения местоположения.
Сообщите мне, должен ли я разъясниться, поскольку мне несколько трудно объяснить.
AFAIU, который почти невозможно ПРЕДПОЛОЖИТЬ, если Вы не знаете диапазон чисел рядом с числом, Вы добрались. Например, следующее число могло быть 14, мог быть 50, мог быть 1000. Если Вы будете знать диапазон, то следующее число будет в тогда, можно сделать это легко:
$ grep -E -m 1 "1[4-9]|2[0-9]|3[0-9]|4[0-9]" file.txt
16
Здесь я ищу числа, больше, чем 13, и диапазон 14< = ЦИФРА < = 49. -m 1
гарантирует, что grep
остановится после нахождения первого соответствия, в этом случае следующее число после 13 в файле.
РЕДАКТИРОВАНИЕ: , Если Вы не уверены, можно попробовать этот сценарий:
#!/bin/bash
i=14
while :; do
grep "$i" file.txt 2>/dev/null && break || i=$((i+1))
done
Набор i
как число Вы добрались плюс 1. Это пройдет файл, ищущий числа, больше, чем 13, если найдено число показывают, и операция заканчивается иначе, число будет увеличено одним, и поиск продолжится.
Если Вы хотите, чтобы использование awk
вставило что-то, то используйте его непосредственно:
awk 'flag { print "I am inserting stuff"; flag = 0} $1 > 13 && !seen {flag = 1; seen = 1} 1'
С Вашим примером:
$ awk 'flag { print "I am inserting stuff"; flag = 0} $1 > 13 && !seen {flag = 1; seen = 1} 1' foo
1
3
4
5
9
16
I am inserting stuff
17
21
Возможно, не, что Вы хотели, но поскольку Вы на самом деле пытаетесь вставить значение, я лично добавил бы число к списку и затем использовал бы sort -n
принести вещи в правильный порядок.
Такая команда могла быть похожей на это (если список находится в файле):
echo 13 | cat listfile - | sort -n | sed '/^$/d' | cat - > listfile
(Замените 13 числом, которое Вы хотите вставить, возможно, переменная x
, таким образом, последовательность команды запустилась бы с echo $x |
)
Для объяснения я разделю его:
echo 13 |
производит номер 13 к stdout, который затем передается по каналу в следующую командуcat listfile - |
сначала берет содержание listfile, впоследствии все от stdin до EOF, и затем передает связанный результат по каналу к stdin следующих командsort -n |
берет переданный по каналу список и сортирует, он принимающий числовую природу входа во внимание (как дано переключателем-n, также посмотрите man sort
)sed '/^$/d' |
удаляет любые пустые строки из строки и вперед этого сноваcat - > listfile
откладывает все это в listfile снова. Да, это работает в противоположность вещам как sed 's/a/b/g somefile > somefile'
, который освободил бы файл.Если Вы хотите разделить его на несколько команд, можно сделать вещь укусом более четкий, всегда воздействуя на файл:
echo 13 >> listfile
sort -n listfile
sed -i '/^$/d' listfile
Это может также пригодиться, если необходимо добавить многократные въезды. Просто добавьте их всех и затем вид (который может быть быстрее, чем поиск положений вставки каждый раз).
Выше команды также работает, если Вы воздействуете на переменные. Для этого содержание var должно присутствовать как строка с помощью разделения новой строки, таким образом, это может быть отсортировано мудрое строкой.
Если значения, например, располагают с интервалами разделенный, Вы могли бы использовать следующую команду
list=$(echo $list 13 | sed -r 's/\s+/\n/g' | sort -n | sed '/^$/d')
Кроме переменного присвоения, единственная новая команда является первой sed
, который заменяет любую непрерывную последовательность пробельных символов (включая новые строки) новыми строками для создания разделения строки. В переменном присвоении список будет автоматически преобразован назад в разделение пространства.