0

我想跳转到文件中的特定行,第 33866 行。如果此行中的第三个数字在 -10 和 +10 范围内,那么我想将整个下一行 33867 打印到文件中并停下来。

如果不是,那么它应该查看第 67893 行(+34027 的差异),现在如果它在范围内 - 打印下一行并停止。

这应该继续,接下来查看第 101920 行(差 +34027)等等,直到找到该范围内的值或到达文件末尾。

现在无论是否打印任何内容,我都需要它来重复该过程,但在新的起始行,这次新的起始行是 33869(差异 3),将第 33870 行打印到同一个文件。理想情况下,它会重复 n 次,n 是用户在脚本运行时输入的读取值。

如果这要求太多,请在此阻止我,我会回去用头撞墙并在网上搜索如何自己完成这项工作。如果我尝试跳到特定行并应通过另一种方式搜索该行,请告诉我是否以错误的方式进行此操作。非常感谢任何输入!

编辑:这是正在处理的两行的示例:

    17.33051021          18.02125499          30.40520932
    1.776579372         -23.74037576          12.48448432

第一个数字从第 6 列开始,第二个数字从 26 开始,第三个从 46 开始。(如果忽略减号,我认为这无关紧要)

4

2 回答 2

2

阅读您的问题,我想您的文件可能很大。我还假设“第三个数字”是第三个字段。所以我想出了这个单行:

awk -v l=33866 -v d=34027 'NR==l&&$3>=-10&&$3<=10{p=1;next}p{print;exit}{l+=d}' file

您只需要更改两个参数 (l (first line No. you need to check)d (difference))。

在找到要打印的正确行后,awk 将停止处理文件中的其他行。

  • 没有测试,如果有错别字,对不起,但它表明了我的想法
  • 您应该给出一些示例输入等,即第三个数字,那是什么?第三场?或喜欢aa bb 2 dfd 3 asf 555555
  • 另一个,实际上你应该展示你为你的问题做了什么
于 2013-07-11T12:35:20.610 回答
0

由于我们没有任何可测试的输入,因此我在不进行测试的情况下给您答案。

tl=$(wc -l input)
awk '{
   for (i=33866; i<tl; i+=34027) {
      if (NR==i && $3 >= -10 && $3 <= 10) {
         getline;
         print;
         exit;
      }
   }
}' input
于 2013-07-11T12:26:07.940 回答