Awk 打印大文件中前N行满足特定条件的每一行
我想打印大文件中的每一行,其中前10行在特定列中具有特定值(在下面的示例中,第9列的值小于1)。我不想把整个文件都存储在内存中。我正尝试将awk用于此目的,如下所示: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 }'
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来说是一个特别的问题,因为你不需要初始化变量,所以拼写错误只会创建一个新的变量。