当我指定要打印的字段时,为啥 AWK 在文件操作的默认读取记录中打印整行

Posted

技术标签:

【中文标题】当我指定要打印的字段时,为啥 AWK 在文件操作的默认读取记录中打印整行【英文标题】:Why is AWK printing the whole line in the default read record from file action when i specify the fields to be printed当我指定要打印的字段时,为什么 AWK 在文件操作的默认读取记录中打印整行 【发布时间】:2021-08-12 07:22:35 【问题描述】:
    #!/usr/bin/awk -f
    
    BEGIN 
            FS="><";
            print "XML Tags";
    
    
            for(x=1; x<=NF; x++) 
                    if (x==1) 
                            f=$x">";
                     else 
                            f="<"$x">";
                    
                    if (f!="\n") 
                            printf f"\n";
                    
            
    
    END 
            print "End of tags";
     $1;

大家好,

我有一个 XML 文件,它都在一行上。我正在使用上面的 AWK 脚本将其分成几行。 该脚本在单独的行中生成每个字段,然后再次打印整行。

由于这对我来说是一个学习练习,有人能指出我哪里出错了吗?

当我在默认操作前面添加一个模式作为条件时,我仍然得到相同的输出,如上所述。我添加的模式是 /SIZE/,它是文件中唯一一行中的一个单词。

我看到的输出在我的 Gentoo 机器和我的 AIX 机器上是相同的。所以它一定是我的代码。

这让我发疯了......

【问题讨论】:

不要使用“模式”这个词,因为它有歧义(参见***.com/q/65621325/1745001)。通常,当人们在参考 awk 脚本时说“模式”时,他们实际上是指“条件”,所以真的不清楚“当我在条件前面添加模式时”可能意味着什么。请添加简明、可测试的示例输入和预期的输出来证明您的问题。 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。 我建议从你的脚本中删除$1 并且不要使用 shebang 来调用 awk,请参阅 ***.com/a/61002754/1745001。 不要使用printf f"\n",而是使用print fprintf "%s\n", f。如果/当f 包含printf 格式字符,如%sprintf f"\n" 将失败。这适用于任何使用printf 输入数据。最后 - f 永远不能是 \n(它甚至不能包含 \n)所以你的比较 if (f!="\n") 永远是正确的。 【参考方案1】:

您可以使用xmllint 来制作漂亮的 XML 打印,而不是与 awk 打架:

xmllint --format filename

对于 Solaris,您可以查看man page

您也可以查看this Q/A

【讨论】:

感谢您的建议 Romeo,我的 Gentoo 盒子上有它,但我不确定 Solaris AIX 盒子 - 它已经过时并且在生产中 - 这意味着它已被剥离。我会去看看未来的努力,但是,这纯粹是为 AWK 学习。 @HonkeyPig,似乎 xmllint 是 Solaris 的标准部分(至少 11 个)。关于 AIX 不确定。检查我编辑的答案 干杯罗密欧 :) 我将在工作时间尽快检查服务器,看看它是否在那里 - 他们仍然可以删除它。 xmllint 不存在【参考方案2】:

答案是从脚本末尾删除 $1 - 它是在 ksh 脚本中运行 AWK 后遗留下来的

【讨论】:

这是赛勒斯的回答,但他还没有回来回答。

以上是关于当我指定要打印的字段时,为啥 AWK 在文件操作的默认读取记录中打印整行的主要内容,如果未能解决你的问题,请参考以下文章

awk的基本使用

二十八awk

AWK

awk工具的使用

AWK - 打印输入文件每行的倒数第二个字段

awk二十问