如何使用行的循环变量实现 awk?
How to implement awk using loop variables for the row?
我有一个n行4列的文件,我想逐行读取第2列和第3列的内容。我做了这个
awk 'NR == 2 {print " "}' coords.txt
例如, 适用于第二行。但是,我想将该代码包含在一个循环中,这样我就可以逐行显示 coords.txt,而不是 NR == 2
我想在执行时使用 NR == i
之类的东西在不同的 i.
值上
我会尽量说得更清楚。我不想 wxtract coords.txt 的第 2 和第 3 列。我想独立使用每个元素。例如,我希望能够实现以下代码
for (i=1; i<=20; i+=1)
awk 'NR == i {print " "}' coords.txt > auxfile
func(auxfile)
end
其中 func 表示我想对每行的第 2 列和第 3 列的值执行的任何操作。
我正在使用 SPP,它是 FORTRAN 和 C 的混合体。
我该怎么做?谢谢
像这样应该可以,不需要 shell 循环。
awk 'BEGIN {f="aux.aux"}
NR<21 {close(f); print , > f; system("./mycmd2 "f)}' file
将在前 20 行调用带有临时文件名的命令,每次调用都会覆盖该文件。当然,如果您的函数从标准输入而不是文件名获取参数或输入,则有更简单的解决方案。
这里./mycmd2
是一个以文件名作为参数的可执行文件。不确定如何调用函数,但这足够通用...
另请注意,外部调用没有错误处理。
调用awk 20次当然是低效的。您希望将逻辑推入 awk 中,这样您只需要解析一次文件。
但是,将 shell 变量传递给 awk 的一种方法是使用 -v
选项:
for ((i=1; i<20; i+=2)) # for example
do
awk -v line="$i" 'NR == line {print , }' file
done
这里i
是shell变量,line
是awk变量
可怕的 system( ) 在 awk 中的唯一方式就像
system("printf 7%s\n7 7" "7 7" "7 | func 7/dev/stdin7; ");
如果提到的func( ) OP可以被GNU parallel,或者xargs直接调用,并且可以取$2 + $3的值作为它的$1 $2,那么OP甚至可以像
{mawk/mawk2/gawk} 'BEGIN { OFS=ORS="[=11=]"; } { print , ; } (NR==20) { exit }' file \
\
| { parallel -0 -N 2 -j 3 func | or | xargs -0 -n 2 -P 3 func }
我有一个n行4列的文件,我想逐行读取第2列和第3列的内容。我做了这个
awk 'NR == 2 {print " "}' coords.txt
例如, 适用于第二行。但是,我想将该代码包含在一个循环中,这样我就可以逐行显示 coords.txt,而不是 NR == 2
我想在执行时使用 NR == i
之类的东西在不同的 i.
我会尽量说得更清楚。我不想 wxtract coords.txt 的第 2 和第 3 列。我想独立使用每个元素。例如,我希望能够实现以下代码
for (i=1; i<=20; i+=1)
awk 'NR == i {print " "}' coords.txt > auxfile
func(auxfile)
end
其中 func 表示我想对每行的第 2 列和第 3 列的值执行的任何操作。
我正在使用 SPP,它是 FORTRAN 和 C 的混合体。
我该怎么做?谢谢
像这样应该可以,不需要 shell 循环。
awk 'BEGIN {f="aux.aux"}
NR<21 {close(f); print , > f; system("./mycmd2 "f)}' file
将在前 20 行调用带有临时文件名的命令,每次调用都会覆盖该文件。当然,如果您的函数从标准输入而不是文件名获取参数或输入,则有更简单的解决方案。
这里./mycmd2
是一个以文件名作为参数的可执行文件。不确定如何调用函数,但这足够通用...
另请注意,外部调用没有错误处理。
调用awk 20次当然是低效的。您希望将逻辑推入 awk 中,这样您只需要解析一次文件。
但是,将 shell 变量传递给 awk 的一种方法是使用 -v
选项:
for ((i=1; i<20; i+=2)) # for example
do
awk -v line="$i" 'NR == line {print , }' file
done
这里i
是shell变量,line
是awk变量
可怕的 system( ) 在 awk 中的唯一方式就像
system("printf 7%s\n7 7" "7 7" "7 | func 7/dev/stdin7; ");
如果提到的func( ) OP可以被GNU parallel,或者xargs直接调用,并且可以取$2 + $3的值作为它的$1 $2,那么OP甚至可以像
{mawk/mawk2/gawk} 'BEGIN { OFS=ORS="[=11=]"; } { print , ; } (NR==20) { exit }' file \
\
| { parallel -0 -N 2 -j 3 func | or | xargs -0 -n 2 -P 3 func }