0

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

awk 'NR == 2 {print $2" "$3}' coords.txt

例如,它适用于第二行。但是,我想将该代码包含在一个循环中,这样我就可以逐行查看 coords.txt,而不是在遍历 i 的不同值时NR == 2使用类似的东西。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

其中 func 表示我想要对每行的第 2 列和第 3 列的值做的任何事情。

我正在使用 SPP,它是 FORTRAN 和 C 的混合体。

我怎么能这样做?谢谢

4

3 回答 3

1

调用 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 变量。

于 2021-03-02T22:46:16.973 回答
0

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

 awk 'BEGIN {f="aux.aux"}
      NR<21 {close(f); print $2,$3 > f; system("./mycmd2 "f)}' file

将使用前 20 行的临时文件名调用命令,该文件将在每次调用时被覆盖。当然,如果您的函数从标准输入获取参数或输入而不是文件名,则有更简单的解决方案。

./mycmd2是一个可执行文件,它以文件名作为参数。不知道你如何调用你的函数,但这足够通用......

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

于 2021-03-02T22:13:31.557 回答
0

awk 中可怕的 system() 的唯一方法是

system("printf \047%s\\n\047 \047" $2 "\047 \047" $3 "\047 | func \047/dev/stdin\047; "); 

如果提到的 func() OP 可以直接由 GNU parallel 或 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 }
于 2021-03-09T00:39:28.940 回答