带有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内部转悠一样?假设我没有内存问题