bash - 压缩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 的范围并将结果输出到另一个名为“ranges2.csv”的 csv 文件中。所以输出将是:
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 脚本的新手。
我知道如何将结果输出到另一个文件中,但我需要的功能让我头疼。
解决方案
假设您的范围已排序,则此代码仅为您提供合并的范围:
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
推荐阅读
- python - 有没有办法解决具有 n 个约束的约束优化函数(拉格朗日)?
- uml - 如何避免创建冗长而复杂的序列图?
- android - Firebase 云消息通知在设备上不可见,但 onMessageReceived 正在执行
- mysql - 将文件加载到 MySQL 的“Azure Database for MySQL”实例中
- c++ - 通过 const std::function 引用传递临时 lambda 应该会失败,但似乎可以工作
- c# - 即使 url 包含 ASP.NET MVC 上的验证密钥信息,重置密码视图也不会加载
- git - 在不使用“--hard”选项的情况下使“git reset”生效
- python-3.6 - python3.6中的rpmUtils.miscutils
- c# - 在视图中呈现时自动关闭 html 标签?
- powershell - 将每行的字符串移动到特定位置