2016-09-27 29 views
-1

我是新編寫bash腳本並有以下問題;如何從包含多個遞增和遞減數字序列的列中提取範圍(第一個和最後一個值),該列可以增加或減少3,並在檢測到增量大於3時跳轉到下一個序列。例如:如何從包含多個序列的列中grep數值序列的範圍

1 
4 
7 
20 
23 
26 
100 
97 
94 

它也需要接受作爲輸出:

1,7 
20,26 
100,94 
+0

不可能的'sed'(當然,現實,反正)。下面的awk解決方案看起來可用。另外,S.O.旨在幫助人們解決他們的編程問題,希望您能展示出解決問題的最佳嘗試。在此處發佈更多問題之前,請閱讀http://stackoverflow.com/tour,http://stackoverflow.com/help/how-to-ask,http://stackoverflow.com/help/dont-ask和http ://stackoverflow.com/help/mcve。祝你好運。 祝你好運。 – shellter

+0

謝謝fedorqui,我的錯誤是沒有發佈我的第一次嘗試,很高興收到這些信息。乾杯。 –

回答

3

用awk:

$ awk 'NR==1||sqrt(($0-p)*($0-p))>3{print p; printf "%s", $0 ", "} {p=$0} END{print $0}' file 

1, 7 
20, 26 
100, 94 

解釋:

NR==1 || sqrt(($0-p)*($0-p))>3 { # if the abs($0-previous) > 3 
    print p      # print previous to end a sequence and 
    printf "%s", $0 ", "   # start a new sequence 
} 
{ p=$0 } 
END { print $0 } 
+0

感謝James提供並解釋的解決方案,它符合我目前的需求。乾杯。 –

3

這個awk腳本給你預期的輸出:

awk '{v=$NF} 
    NR==1{printf "%s,",v;p=v;next} 
    (p-v)*(p-v)==9{p=v;next} 
    {printf "%s\n%s,",p,v;p=v} 
    END{print v}' file