我希望打印一个大文件中的每一行,其中前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列是否符合我的条件,然后打印当前行。对此有任何帮助,或以更有效的方式提出建议,我们非常感谢!
答案 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
的行。这是第一个有前几行的。$9
。对所有行执行此操作。