读取 awk 脚本中的 CSV 文件(关闭)

Read a CSV file inside awk script (CLOSED)

我想使用 AWK 脚本而不在终端中输入 CSV 文件,而是从我的代码中调用该文件。

当前输入端:

./script.awk file.csv

所需的输入终端:

./script.awk

另一方面,这是我目前完成的脚本:

#!/usr/bin/awk -f

BEGIN{print"Filtered Elements:"}
BEGIN{FS=","}

{ if (~/.*5.*/ && ~/.*Sh.*/ && (~/.*i.*/ || ~/.*s.*/)) { print } }
{ if (~/.*ra.*/ && ~/.*18.*/ && ~/.*r.*/) { print } }
{ if (~/.*7.*/ && ~/.*l.*/ && (~/.*Fi.*/ || ~/20.*/)) { print } }
} **file.csv**

我也试过这样做:

#!/usr/bin/awk -f
BEGIN{print"Filtered Elements:"}
BEGIN{FS=","}
BEGIN{
   while (getline < file.csv > 0) {
{ if (~/.*5.*/ && ~/.*Sh.*/ && (~/.*i.*/ || ~/.*s.*/)) { print } }
{ if (~/.*ra.*/ && ~/.*18.*/ && ~/.*r.*/) { print } }
{ if (~/.*7.*/ && ~/.*l.*/ && (~/.*Fi.*/ || ~/20.*/)) { print } }
   } 

但是无论哪种方式都发生了错误。 提前致谢!

awk 脚本不是您调用的命令,它是由 awk 解释的一组指令,其中 awk 是您调用的命令。您显然想做的是编写一个 Unix 命令,该命令作为 shell 脚本实现,其中包括对 awk 的调用,例如:

#!/usr/bin/env bash

awk '
    { print "foo", [=10=] }
' 'file.csv'

将其存储在名为 stuff 的文件中(不是 stuff.awkstuff.sh 或任何其他带有后缀的文件),然后将其命名为 ./stuff 或只是 stuff 如果当前目录在你的 PATH.

虽然从技术上讲您可以使用 shebang 直接调用 awk,但不要这样做 - 请参阅

你的第二个例子是一个正确的 getline 循环,除了文件路径应该被引用以被视为一个字符串(而不是一个变量):while (getline < "file.csv" > 0) #....

或者,您可以通过在 BEGIN 块中操作 ARGVARGC 来设置脚本参数(包括输入文件和变量):

BEGIN {
    ARGV[1] = "file.csv"
    ARGC = 2
}

{
    # commands here process file.csv as normal
}

运行 这与 ./script 相同,如果您使用 shell 设置参数(如 ./script file.csv)。