awk — печатать перекрывающиеся диапазоны

Боюсь, я не сталкивался с прямым способом сделать это, хотя я пытался адаптировать некоторые предоставленные решения для подобных сценариев (но не совсем для того, что мне нужно). Учитывая эти данные:

1118 1120
1121 1124
1122 1127
1125 1126
1128 1133
1130 1135
1136 1139
1137 1138
1140 1145

Он уже отсортирован по столбцу 1. За исключением первой и последней строк, все остальные имеют интервалы, которые перекрываются попарно. Итак, я хочу получить результат только с перекрывающимися диапазонами:

1122 1124
1125 1126
1130 1133
1137 1138

По крайней мере, для меня это сложнее, чем я ожидал на первый взгляд.


person one-liner    schedule 18.07.2017    source источник
comment
tried adapting some provided solutions пожалуйста, добавьте это к вопросу... это покажет ваши усилия... в противном случае, скорее всего, вопрос будет рассматриваться как просьба о бесплатном кодировании...   -  person Sundeep    schedule 18.07.2017
comment
почему 1122 1127 не должно быть в выводе?   -  person RomanPerekhrest    schedule 18.07.2017
comment
@Sundeep: stackoverflow.com/questions/12742484/; stackoverflow.com/ вопросы/16638951/; stackoverflow.com/questions/21488613/awk-to-find-overlaps< /а>; stackoverflow.com/questions/38482040/; Был еще один, которого не было в stackoverflow, но я не могу найти его снова.   -  person one-liner    schedule 18.07.2017
comment
вы можете связать их в вопросе + добавить вариант, который вы пробовали, которого нет в этих ссылках...   -  person Sundeep    schedule 18.07.2017
comment
@RomanPerekhrest Я снова посмотрел на данные, но не понимаю, почему это должно быть так, может быть, я что-то упускаю. В любом случае я действительно пропустил один интервал: 1125 1126   -  person one-liner    schedule 18.07.2017


Ответы (1)


Вот один из способов сделать это в awk. Вероятно, есть более эффективный способ.

awk '{b=e=0; for(i=$1; i<=$2; i++) { if (exists[i]) if(b==0) {b=e=i} else {e=i}; exists[i]=i; } if(b) print b,e; }' input_file
person flu    schedule 18.07.2017