在特定行中搜索范围内的值。 Unix bash脚本

时间:2013-07-11 12:17:30

标签: bash unix awk

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

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

这应该继续,接下来看10,10行(差异为+34027),依此类推,直到找到该范围内的值或到达文件末尾。

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

如果这个问题太多,请立即阻止我,我会回到墙上敲头,在网上搜索如何自己完成这项工作。如果我试图跳转到特定的行并且应该通过其他方式搜索该行,我也知道我是否采用了错误的方法。 任何输入都非常感谢!

编辑: 以下是处理两行的示例:

    17.33051021          18.02125499          30.40520932
    1.776579372         -23.74037576          12.48448432

第一个数字从第6列开始,第二个数字从26开始,第三个从46开始。(如果忽略忽略,我认为这不重要)

2 个答案:

答案 0 :(得分:2)

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

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
  • 另一个,实际上你应该展示你为你的问题做了什么

答案 1 :(得分:0)

由于我们没有任何输入可供测试,我在没有测试的情况下给你答案。

tl=$(wc -l input)
awk '{
   for (i=33866; i<tl; i+=34027) {
      if (NR==i && $3 >= -10 && $3 <= 10) {
         getline;
         print;
         exit;
      }
   }
}' input