使用 AWK 获取文件的开始和结束正在影响性能



尝试在文件的"从开始到中间"one_answers"从中间到结尾"之间进行切片。使用END命令进行编码会影响脚本的性能,并且往往需要更多的时间和start_pos is hardcoded to 1。应该有什么更好的方法来做到这一点。

CCD_ 3 1。从第一个位置 2开始的更有效的方式不是将开始位置硬编码为1。不是将END位置硬编码为END,从第一个位置 3开始的更有效的方式是什么。定义调用END命令的文件的END位置会影响性能吗?``

开始定位代码:awk 'NR>= v1 & & NR<=v2' v1="${start_pos}" v2="${mid_pos}" file

结束位置代码:awk 'NR>= v3 & & NR<=v4' v3="${next_mid}" v4="END" file

切片文件的最快方法如下:

awk 'FNR>n{exit}(FNR>=m)' m=5 n=10 file

如果你想让这种方法成为可能,它是通用的,也可以与文件的"END"一起工作,你可以这样做:

awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n=10 file       # cut line 5 to 10
awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n="EOF" file    # cut line 5 till EOF
awk '(FNR<m){next}1;(FNR==n){exit}' m=5 n=-1 file       # cut line 5 till EOF
awk '(FNR<m){next}1;(FNR==n){exit}' m=1 n=10 file       # cut line 1 till 10
awk '(FNR<m){next}1;(FNR==n){exit}' m=1 n=10 file       # cut line "BOF" till 10

这样做的原因是,当与数字运算符(如"<=="(一起使用时,字符串会转换为数字ZERO(后者是数字,因为FNR是整数。


FNR:当前文件的记录号
next:停止处理此记录,并移动到文件中的下一条记录
exit:终止任何文件处理,并执行END语句(如果可用((此处没有(

如果您只想打印一系列行,awk就太过分了。使用sed:

sed -n "${start_pos},${mid_pos}p; ${next_mid},$p" file

如果您不想打印从next_mid到文件末尾的行,而是打印到文件末尾之前的某个位置,请使用第四个行号变量:

sed -n "${start_pos},${mid_pos}p; ${next_mid},${next_end}p; ${next_end}q" file

最新更新