了解 awk(外壳脚本)中的拆分函数:


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 个参数:

  1. 必填:要拆分的字符串
  2. 必需:使用拆分原始字符串产生的子字符串填充的数组
  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

相关内容

  • 没有找到相关文章

最新更新