打印前N行满足特定条件的大文件中的每一行

时间:2016-04-30 17:18:37

标签: awk

我希望打印一个大文件中的每一行,其中前10行在特定列中具有特定值(在下面的示例中,第9列的值为< 1)。我不想将整个文件存储在内存中。我试图将awk用于此目的如下:

awk 'BEGIN{FS=","}
   {
   for (i=FNR,i<FNR+10, i++) saved[++s] = $0 ; next
   for (i=1,i<s, i++)
       if ($9<1)
   print saved[s]; delete saved; s=0
  }' file.csv

此命令的目标是保存前10行,然后检查每行中的第9列是否符合我的条件,然后打印当前行。对此有任何帮助,或以更有效的方式提出建议,我们非常感谢!

2 个答案:

答案 0 :(得分:2)

无需在内存中存储任何内容或对值进行任何显式循环。如果最后10行(包括)具有$ 9的值,则打印当前行&lt; 1只是:

awk -F, '(c=($9<1?c+1:0))>9' file

当然未经测试,因为您没有提供任何样本输入或预期输出,所以检查数学,但这是正确的方法,如果数学是错误的,那么修改它的调整只是将>9更改为>10或任何你需要的东西。

答案 1 :(得分:1)

这是GNU Awk的解决方案:

<强> chk_prev_lines.awk

BEGIN { FS=","
        CMP_LINE_NR=10
        CMP_VAL = 1     }

FNR > CMP_LINE_NR {
        ok = 1
        # check the stored values
        for( i = 0; i< CMP_LINE_NR; i++ ) {
          if ( !(prev_Field9[ i ] < CMP_VAL) ) {
             ok = 0
             break # early return
          }
        }
        if( ok ) print
      }

      { # store $9 for the comparison
        prev_Field9[ FNR % CMP_LINE_NR] = $9
      }

像这样使用:awk -f chk_prev_lines.awk your_file

<强>解释

  • CMP_LINE_NR确定存储前一行的值
  • CMP_VAL确定用于比较的值
  • 条件FNR > CMP_LINE_NR注意,检查其前一行的第一行是CMP_LINE_NR +1的行。这是第一个有前几行的。
  • 最后一个Action存储值$9。对所有行执行此操作。