【问题标题】:Print every line from a large file where the previous N lines meet specific criteria打印大文件中前 N 行符合特定条件的每一行
【发布时间】:2016-04-30 17:18:37
【问题描述】:

我想打印一个大文件中的每一行,其中前 10 行在特定列中具有特定值(在下面的示例中,第 9 列的值

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 列是否符合我的标准,然后打印当前行。非常感谢您对此的任何帮助,或有关更有效方法的建议!

【问题讨论】:

  • 使用for( .. ; .. ; .. )分号而不是逗号。

标签: awk


【解决方案1】:

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

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

当然未经测试,因为您没有提供任何示例输入或预期输出,因此请检查数学,但这是正确的方法,如果数学错误,那么修复它的调整就是将 &gt;9 更改为 @987654323 @ 或任何你需要的东西。

【讨论】:

    【解决方案2】:

    这是 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 &gt; CMP_LINE_NR 负责检查前几行的第一行是带有CMP_LINE_NR +1 的行。这是第一个有这么多行的。
    • 最后一个动作存储值$9。对所有行执行此操作。

    【讨论】:

    • 不要在 awk 中使用所有大写的变量名,因为这会使它们看起来像内置变量名,并有可能与内置变量名发生冲突。此外,这可能只是一种风格的东西,但变量的命名通常是这样的人们很难记住在以后增强代码时使用 if/when,这对于 awk 来说是一个特殊的问题,因为您不需要初始化变量,因此拼写错误只会创建一个新变量。
    猜你喜欢
    • 2015-03-06
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多