我有一个n行4列的文件,我想逐行读取第二和第三列的内容。我做了这个
awk 'NR == 2 {print $2" "$3}' coords.txt
例如,适用于第二行。然而,我想将这些代码包含在循环中,这样我就可以逐行执行codes。txt,而不是NR == 2
,我想在遍历I的不同值时使用NR == i
之类的东西。
我会尽量说得更清楚。我不想提取cods。txt的第二和第三列。我想独立地使用每个元素。例如,我希望能够实现以下代码
for (i=1; i<=20; i+=1)
awk 'NR == i {print $2" "$3}' coords.txt > auxfile
func(auxfile)
end
其中func表示我想对每行的第二列和第三列的值做的任何事情。
我正在使用SPP,它是FORTRAN和c之间的混合。
我怎么能这么做?谢谢你
调用awk 20次当然是低效的。您可能希望将逻辑推入awk,这样您只需要解析文件一次。
然而,传递shell变量给awk的一种方法是使用-v
选项:
for ((i=1; i<20; i+=2)) # for example
do
awk -v line="$i" 'NR == line {print $2, $3}' file
done
这里i
是shell变量,line
是awk变量。
这样应该可以工作,不需要shell循环。
awk 'BEGIN {f="aux.aux"}
NR<21 {close(f); print $2,$3 > f; system("./mycmd2 "f)}' file
将使用前20行的临时文件名调用命令,每次调用时文件将被覆盖。当然,如果你的函数从stdin而不是文件名中接受参数或输入,有一个更简单的解决方案。
这里./mycmd2
是一个可执行文件,它以文件名作为参数。不知道你如何调用你的函数,但这是通用的足够…
还请注意,外部调用没有错误处理。
难看的system()在awk中唯一的方式是
system("printf 47%s\n 47 47" $2 "