awk提示改变参数

时间:2011-11-28 12:18:29

标签: awk

我得到了几段代码:

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

2 个答案:

答案 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