【问题标题】:i want to combine two awk scripts我想结合两个 awk 脚本
【发布时间】:2012-08-23 04:24:57
【问题描述】:

我有两个使用 AWK 的,效果很好

myScript3.awk

    #!/usr/bin/awk -f
    BEGIN {
        FS=">|</"
        OFS=","
    }
    {
     data[count++] = $2
     ptint $2
     }
    END{
       print data[2],data[6],data[3], FILENAME
    }

上述脚本将扫描 xml 文档并返回第 2、6、3 个元素以及文件名。

    for filename in *.xml
    do 
        awk -f myscript3.awk $filename >> out.txt
    done

上面的脚本会扫描整个文件夹并列出xml文件然后执行myscript。 我必须将这两个脚本合并为一个。 感谢您的帮助

【问题讨论】:

  • 我只看到一个 awk 脚本,而不是两个。我错过了什么?

标签: linux awk


【解决方案1】:

关于调用约定的注意事项:如果您以 awk -f script 运行脚本,则不需要在开头使用 shabang (#!) 行。或者,如果 script 是可执行的,您可以使用 shabang 作为 ./script 运行它。

回答

awkBEGINFILEENDFILE,用它们替换 BEGIN/END 并将 xml 文件作为参数,以下应该可以工作:

编辑

正如 Dennis 在下面的 cmets 中所指出的,不需要 BEGINFILE。另请注意,这需要相当新版本的 GNU awk 才能工作。

myScript3.awk

BEGIN {
  FS=">|</"
  OFS=","
}
{
  data[count++] = $2
  print $2
}
ENDFILE {
   print data[2],data[6],data[3], FILENAME
}

像这样运行它:

awk -f myscript.awk *.xml

【讨论】:

  • BEGINFILEENDFILE 是 GNU AWK (gawk) 4 中的新功能,在早期版本的 gawk 或其他 AWK 中都不存在。为什么需要为每个文件重置 FSOFS?只需使用 BEGIN 即可。
  • 是的应该注意到这是一个最近的功能,但在这种情况下非常方便。无需重置FSOFS,我会解决的。
【解决方案2】:
#!/bin/bash
AWKPROG='BEGIN {FS=">|</" OFS=","}
{ data[count++] = $2; ptint $2 }
END {print data[2], data[6], data[3], FILENAME}'
for filename in *.xml;do awk $AWKPROG $filename; done >> out.txt

警告:未经测试。

【讨论】:

    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-10-04
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多