awk按空格序列分割

时间:2012-06-23 11:49:09

标签: regex awk split whitespace separator

awk 中的split(string, array, separator)可以使用空格序列作为分隔符(或者更常见的是任何正则表达式作为分隔符)吗?

显然,可以使用内部autosplit(在输入的每一行上运行FS变量的值作为分隔符)并使用简单的for$0魔法执行特技。但是,我只是想知道使用split本身是否有更简单的方法。

2 个答案:

答案 0 :(得分:2)

从GNU awk(1)手册页:

split(s, a [, r])
  

将字符串s拆分为正则表达式r上的数组a,并返回字段数。如果省略r,则改为使用FS。

这里的要点是你可以使用任何正则表达式来执行字段拆分 - 至少你可以使用gawk。如果您正在使用其他内容,则需要查看文档。

答案 1 :(得分:2)

The GNU Awk User's Guide州:

split(string, array, fieldsep)
  

这将字符串分成由fieldsep分隔的片段,并存储   数组中的碎片。第一部分存储在数组[1]中,第二部分存储在数组[1]中   片段[2],等等。第三个字符串的值   参数 fieldsep,是一个正则表达式 ,描述了拆分字符串的位置(很多   因为FS可以是描述在哪里拆分输入记录的正则表达式。如果   省略fieldsep,使用FS的值。 split返回   创建的元素数量。然后,split函数拆分字符串   以与输入线分割方式类似的方式分段   字段

这是一个简短(有些愚蠢)的示例,它使用一个简单的正则表达式 ".s ",它将匹配任何单个字符,后跟小写s和空格。拆分的结果放入数组a。请注意,匹配的部分放入数组中。

BEGIN { 
  s = "this isn't a string yes isodore?"
  count = split(s, a, ".s ")
  printf("number of splits: %d\n", count)

  print "Contents of array:"
  for (i = 1; i <= count; i++) 
    printf "a[%d]: %s\n", i, a[i]
}

输出:

$ awk -f so.awk

number of splits: 3
Contents of array:
a[1]: th
a[2]: isn't a string y
a[3]: isodore?

文章Advanced Awk for Sysadmins显示了使用split()解析一行的示例。此page包含使用正则表达式将数据拆分为的示例 一个数组。