Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何使用行的循环变量实现awk?_Loops_Awk_Spplang - Fatal编程技术网

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

Loops 如何使用行的循环变量实现awk?,loops,awk,spplang,Loops,Awk,Spplang,我有一个包含n行和4列的文件,我想逐行读取第2列和第3列的内容。我做的 awk 'NR == 2 {print $2" "$3}' coords.txt 例如,它适用于第二行。但是,我希望将该代码包含在一个循环中,这样我就可以一行一行地访问coords.txt,而不是NR==2我希望在检查不同的I值时使用类似NR==I的东西 我会尽量说清楚的。我不想提取coords.txt的第2列和第3列。我想独立地使用每个元素。例如,我希望能够实现以下代码 for (i=1; i<

我有一个包含n行和4列的文件,我想逐行读取第2列和第3列的内容。我做的

awk 'NR == 2 {print $2" "$3}' coords.txt
例如,它适用于第二行。但是,我希望将该代码包含在一个循环中,这样我就可以一行一行地访问coords.txt,而不是
NR==2
我希望在检查不同的I值时使用类似
NR==I
的东西

我会尽量说清楚的。我不想提取coords.txt的第2列和第3列。我想独立地使用每个元素。例如,我希望能够实现以下代码

for (i=1; i<=20; i+=1)
        awk 'NR == i {print $2" "$3}' coords.txt > auxfile
        func(auxfile)
end
for(i=1;i auxfile)
func(auxfile)
结束
其中func表示我想对每行第2列和第3列的值执行的任何操作

我使用的是SPP,它是FORTRAN和C语言的混合体


我怎样才能做到这一点呢?谢谢你

像这样的东西应该可以工作,不需要shell循环

 awk 'BEGIN {f="aux.aux"}
      NR<21 {close(f); print $2,$3 > f; system("./mycmd2 "f)}' file
awk'开始{f=“aux.aux”}
NR f;系统(“./mycmd2”f)}文件
将使用前20行的临时文件名调用该命令,每次调用时该文件将被覆盖。当然,如果您的函数从stdin而不是文件名获取参数或输入,则有更简单的解决方案

这里的
/mycmd2
是一个以文件名为参数的可执行文件。不确定如何调用函数,但这已经足够通用了


还请注意,外部调用没有错误处理。

调用awk 20次当然效率低下。您可能希望将逻辑推入awk,因此只需解析文件一次

但是,将shell变量传递给awk的一种方法是使用
-v
选项:

for((i=1;iawk中可怕的系统()的唯一方式是

system("printf \047%s\\n\047 \047" $2 "\047 \047" $3 "\047 | func \047/dev/stdin\047; "); 
如果上面提到的func()OP可以由gnupallel或xargs直接调用,并且可以接受$2+3的值作为$1$2,那么OP甚至可以使它像多线程一样

{mawk/mawk2/gawk} 'BEGIN { OFS=ORS="\0"; } { print $2, $3; } (NR==20) { exit }' file \
    \
    | { parallel -0 -N 2 -j 3 func | or | xargs -0 -n 2 -P 3 func }

awk'function func(param){anything_with_param();}{func($2”“$3)}
awk'{for(i=1;i您是说您是从名为“spp”的东西而不是从Windows或Unix shell调用awk吗?如果是这样,您应该添加“spp”标记-如何传递“spp”的值awk脚本的变量将取决于您访问“spp”变量值的方式,如果您确实需要这样做的话。@patrick我看到您为spp添加了标记,意思是“串行端口配置文件”,但在上一个问题中,您为spp提供了有关“子集预处理器语言”文档的参考-添加错误的标签比不添加标签更糟糕。我没有看到任何现有的标签,因此我为您创建了一个新的标签
spplang
,并将其添加到您的问题中。OP显然是从一个外壳调用awk,而不是从外壳调用awk。嗯……这不会关闭“f”吗在NR==1时?不确定它将如何执行,因为您在第一次打印之前关闭了aux文件?我是否遗漏了什么?@RAREKpopManifesto怀疑论是一个有用的属性,但这很容易测试和验证。将为每个记录重新创建该文件。如果您每次不关闭它,它将附加到它。那么为什么需要aux文件呢?just系统(“./mycmd2\047“$2”\047\047“$3”\047”);可以。(ps octal\047表示单引号,以防传入的参数不是连续块。如果需要,在$2或$3内转义单引号)OP的脚本似乎采用文件名而不是参数或stdin。效率不高,但这是必需的。然后系统(“printf\047%s\\n\047\047“$2”\047\047“$3”\047 |/mycmd2\047/dev/stdin\047;”;