在备选排序数字之间设置固定的数字比例

Set a fixed numerical ration between alternative sorted numbers

提问人:missway 提问时间:2/12/2022 最后编辑:missway 更新时间:2/12/2022 访问量:33

问:

所以我正在处理一个由一行又一行的数字组成的大型文本文件, 下面只是一个简短的摘录,以帮助回答这个问题,但它甚至可以是一系列随机递增的数字,每行之间有各种数字间隙。

267
368
758
936
1248
1415
1739
1917

我正在寻找一种方法,从第 2 个和第 3 个数字开始,在每对数字之间设置一个固定的数字间隙。例如,100 惠斯特保持每对内的数字差异,但此差异可以是任何数字。

这样,如果将数值差距设置为 100,则上述示例将变为:

267
368
#      gap of 100
468
646
#      gap of 100
746
913
#      gap of 100
1013
1191

有谁知道一个可能的行在 shell 脚本的终端中执行此操作。谢谢

bash shell 终端 编号 序列

评论

0赞 Fravadona 2/12/2022
输入似乎已排序,是这样吗?当前三行是 时会发生什么?267368369
0赞 missway 2/12/2022
369 的第三行将变为 468,其想法是每个偶数 + 下一个数字之间的差值将变为 100。每个奇数 + 以下数字之间的差额将被保留。此外,是的,输入将被排序,因为数字将不断递增,但其速率可以被认为是随机的
0赞 Fravadona 2/12/2022
我很困惑。对于给定的输入,输出是否正确?
0赞 missway 2/12/2022
对于这个输出,我使用了一个计算器,在第二个数字 (368+100=468) 上加 100 后,468 成为第三个数字。然后,我添加了原始第 3 个和第 4 个数字 936-758=178 到 468、468+178 =646 的差异,并继续此过程以创建输出,但是这会导致 1000 行数字的盗版

答:

0赞 pmf 2/12/2022 #1

有点笨拙,但对于初学者来说,我想这就可以了。它读取数字列表(即以开头或类似),然后将其传递到其余部分。stdincat numbers.txt

paste - - | {
        read -r x m;    echo $x;          echo $m
  while read -r x y; do echo $((m+=100)); echo $((m+=y-x)); done
}
267
368
468
646
746
913
1013
1191

解释:让我们一次读取两个数字,这样我们就可以逐行读取(两个数字)。第一对打印出来不变,但随后的对仅作为计算差异的基础,差异被添加到一个运行变量中,该变量也会在每次迭代时递增。paste - -100


这是一个重写为参数化函数,并且不使用:paste

addgaps() {
  read -r m; echo $m; read -r m; echo $m
  while read -r x; read -r y; do echo $((m+=$1)); echo $((m+=y-x)); done;
}
cat numbers.txt | addgaps 100

评论

0赞 missway 2/12/2022
我如何将参数化函数保存到我的系统中,如果它是一个过度的问题,我深表歉意,只是我过去真的很难找到一个易于理解的解释,所以我经常局限于寻找一行终端解决方案。这通常是限制性的
0赞 pmf 2/12/2022
@missway 这取决于您的用例(和您的系统设置)。当你使用时,一种方法是把它放在你的文件中,这样每次你打开一个新的 bash shell 时,它都会被获取。但是,如果您从脚本文件运行代码(而不是在终端的命令行上输入命令),那么将其放入相应的脚本文件中也就足够了。bash~/.bashrc
0赞 missway 2/12/2022
非常感谢您,也感谢您抽出宝贵时间将您的答案扩展为更详细的解释,非常感谢