如何实现awk使用循环变量的行?



我有一个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\n47 47" $2 "47 47" $3 "47 | func 47/dev/stdin47; "); 

如果OP提到的func()可以被GNU并行或xargs直接调用,并且可以接受$2 + $3作为$1 $2的值,那么OP甚至可以像

那样使其完全多线程化。
{mawk/mawk2/gawk} 'BEGIN { OFS=ORS=""; } { print $2, $3; } (NR==20) { exit }' file 

| { parallel -0 -N 2 -j 3 func | or | xargs -0 -n 2 -P 3 func }

最新更新