尝试在文件的"从开始到中间"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