【问题标题】:GAWK Script - Print filename in BEGIN sectionGAWK 脚本 - 在 BEGIN 部​​分打印文件名
【发布时间】:2011-07-23 10:57:03
【问题描述】:

我正在编写一个开始的 gawk 脚本

#!/bin/gawk -f
BEGIN { print FILENAME }

我通过./script file1.html 调用该文件,但脚本什么也没返回。有什么想法吗?

【问题讨论】:

    标签: linux bash shell awk gawk


    【解决方案1】:

    如果你真的想在 BEGIN 块中使用它,你可以使用 ARGV[1] 代替 FILENAME

    awk 'BEGIN{print ARGV[1]}' file
    

    【讨论】:

    • 如果有文件名则有效 - 但如果没有文件名则不打印破折号(因此脚本从标准输入读取)。
    • @Jonathan,问题是,“我正在通过 ./script file1.html 调用文件”
    • +1,但警告如果你使用它,你不能使用任何命令行参数。因此,如果 ./script file1.html 是唯一可以运行的方法,那就没问题了。如果你添加了./script --argument1ofn file1.html,你又会被搞砸了。
    【解决方案2】:

    遇到第1行可以打印文件名:

    FNR == 1
    

    如果你想不那么神秘,更容易理解:

    FNR == 1 {print}
    

    更新

    我的前两个解决方案不正确。谢谢丹尼斯指出。他的方法是正确的:

    FNR == 1 {print FILENAME}
    

    【讨论】:

    • 其中任何一个打印文件的第一条记录。使用您的技术满足 OP 需求的正确方法:FNR == 1 {print FILENAME}(换句话说,虽然您的“不那么神秘”适用于打印$0,但在这种情况下需要它(和变量名)) .无论如何都要 +1
    • 这适用于多个文件,而接受的答案仅适用于第一个输入文件。这应该被接受的答案。好工作 ! +1
    【解决方案3】:

    直接来自手册页(稍微重新格式化):

    FILENAME:当前输入文件的名称。如果命令行上没有指定文件,则 FILENAME 的值为“-”。但是,FILENAME 在 BEGIN 块内是未定义的(除非由 getline 设置)。

    【讨论】:

      【解决方案4】:

      基于 Hai Vu 的回答,我建议如果您只希望每个文件打印一次文件名,则需要将其包装在条件中。

      if(FNR == 1) { print FILENAME };
      

      【讨论】:

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