如何在AWK中检测记录是否以RS结尾?

如何在AWK中检测记录是否以RS结尾?,awk,Awk,在awk中,$0代表原始行,尾随的RS带条纹。 但是我如何知道最后一行是否以RS结尾?如果该行没有以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。 因此,当您打印$0时,遇到RS总是正确的 AWK默认RS为单个新行 打印最后一行 awk -v max="$(wc -l < file)" 'FNR == max { print "Final line:",$0 }' file 如果行不以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。 因此,当您打印$0时,

在awk中,
$0
代表原始行,尾随的RS带条纹。

但是我如何知道最后一行是否以RS结尾?

如果该行没有以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。 因此,当您打印$0时,遇到RS总是正确的

AWK默认RS为单个新行

打印最后一行

awk -v max="$(wc -l < file)" 'FNR == max { print "Final line:",$0 }' file 

如果行不以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。 因此,当您打印$0时,遇到RS总是正确的

AWK默认RS为单个新行

打印最后一行

awk -v max="$(wc -l < file)" 'FNR == max { print "Final line:",$0 }' file 

您可以检查内置
RT
变量是否设置为空。见:

如果输入文件结束时没有任何与RS匹配的文本,则gawk将RT设置为空字符串


您可以检查内置
RT
变量是否设置为空。见:

如果输入文件结束时没有任何与RS匹配的文本,则gawk将RT设置为空字符串


以下任一项都可以:

GNU awk:

gawk 'END{if (RT!="") print "found RS"}' file
任何awk(假设RS没有设置为与FS相同的值)


以下任一项都可以:

GNU awk:

gawk 'END{if (RT!="") print "found RS"}' file
任何awk(假设RS没有设置为与FS相同的值)


如果行不以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。因此,当您打印$0时,遇到的总是RS。那么以EOF而不是RS结尾的输入的最后一行呢@realspiritualsi如果该行不以RS结尾,那么$0将把所有字符放入字符串中,直到遇到RS为止。因此,当您打印$0时,遇到的总是RS。那么以EOF而不是RS结尾的输入的最后一行呢@realspiritual
END
块保持最后一行的处理,在您的第一个案例中使用它不是更有效吗?@Birei END块只在某些AWK中保持最后一行的处理,而不是在所有AWK中。即使是POSIX合规性也不需要该功能。@realspirituals当您打印$0时,说
是不正确的,但遇到RS总是正确的
。例如,如果RS是一个换行符,并且输入文件没有以换行符结尾,那么最后一行仍然会填充$0,就像文件以换行符结尾一样。另外,使用awk时不需要UOOC或sed。@埃德蒙顿:谢谢。我不知道,我以为
END
块是所有
awk
风格之间的标准。@Birei-
END
块是所有awk中的标准块,是
END
块中的内置变量在awk版本之间变化。例如,POSIX要求上次读取记录中的
NF
可用,但不要求
$0
可用。
END
块保持最后一行已处理,在第一种情况下使用它不是更有效吗?@Birei END块仅在某些AWK中保持最后一行已处理,而不是所有AWK。即使是POSIX合规性也不需要该功能。@realspirituals当您打印$0时,说
是不正确的,但遇到RS总是正确的
。例如,如果RS是一个换行符,并且输入文件没有以换行符结尾,那么最后一行仍然会填充$0,就像文件以换行符结尾一样。另外,使用awk时不需要UOOC或sed。@埃德蒙顿:谢谢。我不知道,我以为
END
块是所有
awk
风格之间的标准。@Birei-
END
块是所有awk中的标准块,是
END
块中的内置变量在awk版本之间变化。例如,POSIX要求上次读取记录中的
NF
可用,但不要求
$0
可用。