带有awk且参数变化的提示

带有awk且参数变化的提示,awk,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

我得到了几段代码,如下所示:

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

我在找像这样的东西:


这看起来确实很低效。如前所述,
awk
在循环的每个过程中对输入文件整体进行四次处理。我还非常确定,除非将
FS
环境变量设置为奇怪的值,否则
cut
是完全没有必要的。以下内容将用在数据文件上的单次传递取代多个
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,因为(IMHO)脚本更易于阅读,而且在大文件上似乎要快一点。以下sed表达式相当于awk行:

data=`sed -n -e "$ff p" -e "$ff q" p_walls.raw`

-n
告诉sed仅从脚本选择的行中输出。在本例中,脚本作为两个
-e
参数提供。每个都是一个地址,后跟处理命令。多个命令在sed脚本中是分隔的换行符,但它们也可以由具有相同地址的多个
-e
参数指定。总之,表达式
42 p
告诉sed选择行
42
,并运行打印所选图案空间(第42行)的
p
命令。
42 q
命令告诉实用程序在处理第42行后退出。因此,我们的sed表达式读取“p_walls.raw”中的第一行
$ff
th行,打印
$ff
th行并退出

运行
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

awk”(NR>3&&NR请编辑您的帖子,为p_walls.raw添加一些示例数据(最多3-4行)。还有:标题中的“:TY”是什么意思?祝您好运。我从标题中删除了“TY”…我猜它的意思是“谢谢您”…剪切非常不必要,Shawley,我已经删除了,谢谢您指出它:)但是我会尝试你提出的代码非常感谢!我需要选择行和列,所以我想我需要awk..不确定你能用sed做到这一点..也许sed…|剪切应该是选项…我可能会尝试2再次感谢快速反馈再次读取线程我注意到awk仍然在循环中..不能有其他的w吗在周围转悠?就像在awk内部转悠一样?假设我没有内存问题