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

Awk 打印大文件中前N行满足特定条件的每一行,awk,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 }'

我想打印大文件中的每一行,其中前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
awk'开始{FS=“,”}
{

对于(i=FNR,i,这里是GNU Awk的解决方案:

chk\u上一行。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
      }
BEGIN{FS=“,”
凸轮轴位置线号=10
CMP_VAL=1}
FNR>CMP\u线\u编号{
ok=1
#检查存储的值
对于(i=0;i
像这样使用它:
awk-f chk\u prev\u line.awk您的\u文件

解释

  • CMP\u LINE\u NR
    确定前几行中存储了多少个值
  • CMP_VAL
    确定用于比较的值
  • 条件
    FNR>CMP\u-LINE\u-NR
    需要注意的是,检查前几行的第一行是具有
    CMP\u-LINE\u-NR+1
    的行。这是具有如此多前几行的第一行
  • 最后一个操作存储值
    $9
    。此操作将对所有行执行

无需在内存中存储任何内容,也无需对值执行任何显式循环。如果最后10行(含)的$9值小于1,则要打印当前行,只需执行以下操作:

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

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

使用
for(…;;…)
使用分号而不是逗号。不要在awk中使用所有大写变量名,因为这会使它们看起来像内置变量名,并可能与内置变量名发生冲突。此外,这可能只是一种样式问题,但变量的命名通常以下划线分隔
prev\u field9
或通过改变大小写
prevField9
,但在
prev_Field9
中这样做看起来很奇怪,我认为如果以后增强代码,人们很难记住使用,这对于awk来说是一个特别的问题,因为你不需要初始化变量,所以拼写错误只会创建一个新的变量。