我得到了几段代码:
for ff in `seq 3 $nlpN`;
do
npc1[$ff]=`awk 'NR=='$ff' {print $1}' p_walls.raw`;
echo ${npc1[$ff]};
npc2[$ff]=`awk 'NR=='$ff' {print $2}' p_walls.raw`;
npc3[$ff]=`awk 'NR=='$ff' {print $3}' p_walls.raw`;
npRs[$ff]=`awk 'NR=='$ff' {print $4}' p_walls.raw`;
echo $ff
done
你可以看到我多次调用awk。有没有更快的方法来执行此操作,例如调用awk一次并使用changin参数进行分配?
提前多多感谢!
输入看起来像: ... 3.76023 0.79528 0.307771 8729.82
3.76024 0.814664 0.307849 8650.2
3.76026 0.845679 0.307978 8802.97
3.76025 0.826293 0.307897 8690.43
3.76017 0.65959 0.30722 8936.07 ...
我正在寻找某事:TY
答案 0 :(得分:0)
这看起来效率很低。如上所述,awk
每次循环传递时,整个处理输入文件四次。除非你将cut
环境变量设置为奇怪的东西,否则我也非常确定FS
是完全没必要的。以下内容将替换多个awk
运行,只需一次通过数据文件,该文件在找到该行后停止。然后,您可以使用cut
提取单个字段。
for ff in `seq 3 $nlpN`
do
data=`awk 'NR=='$ff' { print $1, $2, $3, $4; exit }' p_walls.raw`
npc1[$ff]=`echo "$data" | cut -f1 -d ' '`
echo ${npc1[$ff]}
npc2[$ff]=`echo "$data" | cut -f2 -d ' '`
npc3[$ff]=`echo "$data" | cut -f3 -d ' '`
npRs[$ff]=`echo "$data" | cut -f4 -d ' '`
echo $ff
done
请注意,我添加了exit
语句,以便awk在处理完行后退出。这可以防止它在每次传递时读取整个文件。如果您需要做的只是从文件中提取一行,那么您可能希望使用sed,因为(恕我直言)脚本更容易阅读,并且它似乎在大文件上更快一点。以下sed表达式等同于awk行:
data=`sed -n -e "$ff p" -e "$ff q" p_walls.raw`
-n
告诉sed仅输出脚本选择的行。在这种情况下,脚本,作为两个-e
参数提供。每个都是一个地址,后跟处理命令。多个命令在sed脚本中是分隔的换行符,但它们也可以由具有相同地址的多个-e
参数指定。将这一切放在一起,表达式42 p
告诉sed选择行42
并运行p
命令打印选定的模式空间(第42行)。 42 q
命令告诉实用程序在处理第42行后退出。因此,我们的sed表达式从“p_walls.raw”读取第一个$ff
th 行,打印$ff
th 一个并退出。
答案 1 :(得分:0)
一次运行awk
并分别处理每次迭代的输出。
awk "(NR > 3 && NR <= $nlpN)"' { print NR, $1, $2, $3, $4 }' p_walls.raw |
while read ff c1 c2 c3 Rs
do
npc1[$ff]=$c1
echo ${npc1[$ff]};
npc2[$ff]=$c2
npc3[$ff]=$c3
npRs[$ff]=$Rs
echo $ff
done