【问题标题】:Read a CSV file inside awk script (CLOSED)在 awk 脚本中读取 CSV 文件(已关闭)
【发布时间】:2022-01-28 05:15:21
【问题描述】:

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

电流输入端:

./script.awk 文件.csv

所需的输入终端:

./script.awk

另一方面,这是我到目前为止所做的脚本:

#!/usr/bin/awk -f

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

{ if ($8~/.*5.*/ && $2~/.*Sh.*/ && ($3~/.*i.*/ || $4~/.*s.*/)) { print } }
{ if ($3~/.*ra.*/ && $7~/.*18.*/ && $13~/.*r.*/) { print } }
{ if ($5~/.*7.*/ && $2~/.*l.*/ && ($4~/.*Fi.*/ || $12~/20.*/)) { print } }
} **file.csv**

我也尝试过这样做:

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

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

【问题讨论】:

    标签: csv awk


    【解决方案1】:

    您的第二个示例是一个正确的 getline 循环,除了文件路径应被引用以被视为字符串(而不是变量):while (getline &lt; "file.csv" &gt; 0) #...

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

    BEGIN {
        ARGV[1] = "file.csv"
        ARGC = 2
    }
    
    {
        # commands here process file.csv as normal
    }
    

    将其作为./script 运行与使用shell 设置参数相同(如./script file.csv)。

    【讨论】:

      【解决方案2】:

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

      #!/usr/bin/env bash
      
      awk '
          { print "foo", $0 }
      ' 'file.csv'
      

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

      虽然从技术上讲,您可以使用 shebang 直接调用 awk,但不要这样做 - 请参阅 https://stackoverflow.com/a/61002754/1745001

      【讨论】:

        猜你喜欢
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多