当我指定要打印的字段时,为啥 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 f
或printf "%s\n", f
。如果/当f
包含printf
格式字符,如%s
,printf 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 在文件操作的默认读取记录中打印整行的主要内容,如果未能解决你的问题,请参考以下文章