RequestID CustomerID Status
101 101111 Error
102 323232 Success
103 33434 Error
因此,我正在尝试使用拆分选项打印出第一个字段和第二个字段。分隔符位于上方。我知道还有其他各种方法,但我正在尝试在awk中学习拆分功能。我正在尝试以下代码:
awk '{split($1,a,"t");split($2,b,"t");print a[1], b[2]}' data
上面的代码只打印第一列($1)而不是列($2)。有什么具体原因吗?
谢谢
它正在打印 a[1]
,这是整个第一个字段,b[2]
是空的,因为您要拆分整个第二个字段,例如,选项卡上的"101111",这将是一个包含一个元素的数组。
除非您更改字段分隔符,否则 awk 会将输入行拆分为空格上的字段,因此在选项卡上拆分是多余的。你可以print $1, $2
.如果您真的想看到 split 函数的操作,请尝试空格以外的其他操作:
awk '{split($1, a, "0"); print a[1], a[2];}' < input
1 1
1 2
1 3
这是拆分函数的工作原理:
$ cat file
RequestID CustomerID Status
101 101111 Error
102 323232 Success
103 33433 Error
$ awk '{split($0,a,"t"); print a[1],a[2]}' file
RequestID CustomerID
101 101111
102 323232
103 33433
函数采用字符串(在您的情况下应该是您的整行,即$0
)后跟数组名称,在本例中为 a
.最后,如果未提供,则默认情况下为空格的分隔符(在您的情况下为"t"
)。
拆分需要 3 个参数:
- 必填:要拆分的字符串
- 必需:使用拆分原始字符串产生的子字符串填充的数组
- 可选:拆分字符串时要使用的正则表达式,如果不存在,则
FS
。
鉴于很明显,您的代码应该是:
awk '{split($0,a,/t/); print a[1], a[2]}' data
请注意,split() 的第三个参数是一个 RE,所以你不应该做这些建议的事情 elsethread:
awk '{split($0,a,"t")...
awk '{split($0,a,FS)...
"t"
是错误的,因为这是一个常量字符串而不是常量 RE(/t/
),因此需要 awk 解析它两次,这会导致转义字符时出现并发症。
FS
是错误的,因为这只是冗余地指定了您从split($0,a)
获得的默认值。
在awk中,默认的字段分隔符是空格,这里是whitespace
定义:
Fields are normally separated by whitespace sequences (spaces, TABs, and newlines), not by single spaces.
因此,在您的代码中,当您使用 $1 和 $2 时,您已经使用默认字段分隔符(空格)拆分了行。如果您需要尝试拆分功能,则需要目标在$ 0(整行),其他人提供了解决方案,我不需要再写了。
在您的情况下,一个提示是使用 FS
作为拆分函数中的 fieldsep,因此您无需关心是否有空格、多个空格、制表符或其他混合空格,例如:
awk '{split($0,a,FS); print a[1],a[2]}' file