Допущения:
- исходные данные не могут быть отсортированы (численно); в то время как предоставленные образцы данных кажутся отсортированными (численно), комментарии OP об использовании
sort
наводят меня на мысль, что данные могут не быть отсортированы - OP хочет вытащить от
xth
до yth
числа (на основе числовой сортировки); исходный вопрос запрашивает first 4
чисел из данных с желаемым ответом, отображающим 4
наименьшие числа (ie, числа с 1-го по 4-й); дополнительный комментарий OP спрашивает о поиске next 4 matches
, поэтому я ищу общее решение для вытаскивания xth
через yth
чисел - желаемый результат должен поддерживать исходный порядок входных данных
Некоторые примеры данных:
$ cat numbers.dat
123
123
125
126
126
127
127
128
130
131
200
202 # data not sorted
201 # let's see if we can 'ignore' the leading space
203
132 # data not sorted
133
134
Для начала мы рассмотрим поиск первых 4 чисел (на основе числовой сортировки), ie, чисел от 1st
до 4th
. :
$ x=1 y=4 # set start/end positions
$ sort -un numbers.dat # get a unique list of sorted numbers
123
125
126
127
128
130
131
132
133
134
200
201
202
203
$ sort -un numbers.dat | sed -n "${x},${y}p" # extract lines x=1 through y=4
123
125
126
127
$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep # store desired numbers
На этом этапе у нас есть список интересующих нас чисел:
$ cat numbers.grep
123
125
126
127
Используя grep
, теперь можно использовать этот список для извлечения совпадающих строк из исходный код с сохранением исходного порядка:
$ grep -f numbers.grep numbers.dat
123
123
125
126
126
127
127
Некоторые примеры с разными x
и y
:
$ x=5 y=8
$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
$ cat numbers.grep
128
130
131
132
$ grep -f numbers.grep numbers.dat
128
130
131
132
$ x=9 y=20
$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
$ cat numbers.grep # sorted list of numbers we're interested in
133
134
200
201
202
203
$ grep -f numbers.grep numbers.dat
200 # keep in mind this is the order in which the data appears in the source (one of the assumptions)
202
201
203
133
134