簡體   English   中英

壓縮 bash 中數字范圍的范圍

[英]Compress ranges of ranges of numbers in bash

我有一個名為“ranges.csv”的 csv 文件,其中包含:

start_range,stop_range  
9702220000,9702220999  
9702222000,9702222999  
9702223000,9702223999  
9750000000,9750000999  
9750001000,9750001999  
9750002000,9750002999  

我正在嘗試將 stop_range=start_range-1 和 output 的范圍合並到另一個名為“ranges2.csv”的 csv 文件中。 所以 output 將是:

9702220000,9702220999  
9702222000,9702223999  
9750000000,9750002999  

此外,我需要知道有多少范圍包含一個壓縮范圍(例如:對於新范圍9750000000,9750002999 ,我需要知道在壓縮之前有 3 個范圍)。 此信息將幫助我創建一個名為“ranges3.csv”的新 csv 文件,該文件應僅包含其中范圍最多的范圍(最全面的區域):

    9750000000,9750002999  

我在想這樣的事情:

if (stop_range = start_range-1)  
  new_stop_range = start_range-1  

但我不是很聰明,而且我是 bash 腳本的新手。
我知道如何 output 將結果保存在另一個文件中,但是 function 讓我頭疼。

假設您的范圍已排序,則此代碼僅為您提供合並的范圍:

awk 'BEGIN{FS=OFS=","}
     (FNR>1) && ($1!=e+1){print b,e; b=e="" }
     ($1==e+1){ e=$2; next }
     { b=$1; e=$2 }
     END { print b,e }' file    

下面你得到相同但范圍計數:

awk 'BEGIN{FS=OFS=","}
     (FNR>1) && ($1!=e+1){print b,e,c; b=e=c="" }
     ($1==e+1){ e=$2; c++; next }
     { b=$1; e=$2; c=1 }
     END { print b,e,c }' file

如果你想要最大的,你可以在第三列排序。 我不想制定規則來給出計數最多的范圍,因為可能有多個。

如果您真的只想要最大合並的所有范圍:

awk 'BEGIN{FS=OFS=","}
     (FNR>1) && ($1!=e+1){ 
        a[c] = a[c] (a[c]?ORS:"") b OFS e
        m=(c>m?c:m)
        b=e=c=""
     }
     ($1==e+1){ e=$2; c++; next }
     { b=$1; e=$2; c=1 }
     END { a[c] = a[c] (a[c]?ORS:"") b OFS e
           m=(c>m?c:m)
           print a[m]
     }' file

我認為這可以解決問題:

#!/bin/bash

awk '
  BEGIN { FS = OFS = ","}
  NR == 2 {
    start = $1; stop = $2; i = 1
  }
  NR > 2 {
    if ($1 == (stop + 1)) {
      i++; 
      stop = $2
    } else {
      if (++i > max) {
        maxr = start "," stop;
        max = i
      }  
      start = $1
      i = 0
    }
    stop = $2
  }
  END { 
    if (++i > max) {
      maxr =  start "," stop;
    }
    print maxr
  }
' ranges.csv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM