Awk:拆分字段

Awk:拆分字段,awk,Awk,刚接触awk,尝试做一些可能很简单的事情,但这需要我一段时间。为了简化,我有一个名为“sample”的文本文件,其中包含以下行: 164516454242451BX%美国俄亥俄州Apt 110 225 1784 我希望使用awk获得以下输出: 110 225室 有没有办法拆分$1,使“Apt”成为一个单独的字段?我正在尝试的代码如下所示。我没有收到任何错误,但输出只有两个空行 awk ' BEGIN { split($1," ","%") } print $2,$3,$4 END { print

刚接触awk,尝试做一些可能很简单的事情,但这需要我一段时间。为了简化,我有一个名为“sample”的文本文件,其中包含以下行:

164516454242451BX%美国俄亥俄州Apt 110 225 1784

我希望使用awk获得以下输出:

110 225室

有没有办法拆分$1,使“Apt”成为一个单独的字段?我正在尝试的代码如下所示。我没有收到任何错误,但输出只有两个空行

awk '
BEGIN {
split($1," ","%")
}
print $2,$3,$4
END {
print ""
} ' sample

您可以
%
作为分隔符之一:

awk -F'[ %]' '{print $2, $3, $4}' file
同样,也可以使用split来完成:


您可以
%
作为分隔符之一:

awk -F'[ %]' '{print $2, $3, $4}' file
同样,也可以使用split来完成:


+1
split()
的第三个参数是一个字段分隔符,它是一个带有附加属性的regexp,而不是字符串。regexp分隔符是
/
,而不是
这是字符串分隔符。Awk可以通过分析使用字符串的上下文来从字符串构造regexp,以查看它是否是regexp上下文,但最好保持代码清晰简单,并为regexp使用regexp分隔符,除非您有特定的理由不这样做:
split($1,a,/%/)
@EdMorton我知道第三个参数是regex,但不知道它不一定是字符串。按你的建议编辑。谢谢你的信息!在旧的、破损的awk中,它必须是字符串,但所有现代awk都支持重新分隔符。使用字符串和RE之间的区别在于,对于字符串,您必须对您希望按字面理解的任何RE元字符进行双重转义,因为awk在将字符串转换为RE时会使用其中一个转义。使用字符串分隔符的时间是当您想要从字符串加上变量(
split($0,a,somevar“etc”)
)构造RE时,或者我有时使用它们来稍微提高可读性,当RE是正斜杠(
split($0,a,“/”)
而不是
split($0,a,/\/)
)。
+1
split()
的第三个参数是一个字段分隔符,它是一个带有附加属性的regexp,而不是字符串。regexp分隔符是
/
,而不是
这是字符串分隔符。Awk可以通过分析使用字符串的上下文来从字符串构造regexp,以查看它是否是regexp上下文,但最好保持代码清晰简单,并为regexp使用regexp分隔符,除非您有特定的理由不这样做:
split($1,a,/%/)
@EdMorton我知道第三个参数是regex,但不知道它不一定是字符串。按你的建议编辑。谢谢你的信息!在旧的、破损的awk中,它必须是字符串,但所有现代awk都支持重新分隔符。使用字符串和RE之间的区别在于,对于字符串,您必须对您希望按字面理解的任何RE元字符进行双重转义,因为awk在将字符串转换为RE时会使用其中一个转义。使用字符串分隔符的时间是当您想从字符串加上变量(
split($0,a,somevar“etc”)
)构造RE时,或者当RE是正斜杠(
split($0,a,“/”)
而不是
split($0,a,/\/)
时,我有时会使用它们来稍微提高可读性。