2017-07-18 186 views
0

恐怕我还没有遇到过这样做的直接方式,尽管我尝试了一些为类似场景提供的解决方案(但并不完全符合我的需要)。鉴于这样的数据: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 

对我来说,这至少是我乍一看的难点。

+2

'试图适应一些solutions'提供请添加质疑......它会显示你的努力......否则可能的问题将被视为要求免费服务编码.. – Sundeep

+0

何必'1122 1127 '不在输出中? – RomanPerekhrest

+0

@Sundeep:https://stackoverflow.com/questions/12742484/identify-overlapping-ranges-in-awk; https://stackoverflow.com/questions/16638951/how-to-remove-overlap-in-numeric-ranges-awk; https://stackoverflow.com/questions/21488613/awk-to-find-overlaps; https://stackoverflow.com/questions/38482040/using-awk-to-print-pairs-of-records-having-overlapping-range-of-values-between-t;还有一个在stackoverflow上找不到,但我找不到它。 –

回答

0

这里有一种方法可以在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