awk的默认字段分隔符

问题描述 投票:20回答:3

很抱歉这个愚蠢的问题,已搜索但不确定是否找到了正确的答案,因此默认分隔符仅是awk的空格?

linux unix awk posix separator
3个回答
21
投票

这里是一个实用摘要,适用于所有主要的Awk实现

  • GNU Awk(gawk)-some Linux发行版中的默认awk
  • Mawk
  • mawk)-some Linux发行版中的默认awk(例如,Ubuntu的早期版本crysman报告说19.04版本现在随GNU一起提供) Awk-请在下面查看他的评论。)
  • BSD
  • Awk-又名BWK Awk-类似BSD的平台(包括OSX)上的默认awk

    在Linux上,awk -W version会告诉您默认的awk是哪种实现。BSD Awk only

理解awk --version(GNU Awk理解[awk -W version另外)。

all

的最新版本,相对于field分隔符 [1]](但不是[[record分隔符),这些实现遵循POSIX standard词汇表:

  • [RSinput-record

    分隔符,它描述如何将输入分成records >>
    • POSIX强制默认值是newline
    ,以下也称为\n;也就是说,输入默认情况下被分解为awk的命令行上,可以将RS指定为-v RS=<sep>
  • POSIX将RS限制为
  • 文字,单字符
  • 值,但是GNU Awk和Mawk支持多字符可能是扩展正则表达式的值(BSD Awk做到不支持。)>
  • [FS

  • 输入-字段分隔符,它描述了每个记录
如何拆分为字段;它可能是扩展正则表达式
    awk的命令行上,可以将FS指定为-F <sep>(或-v FS=<sep>)。
  • POSIX-mandated default valueformally
  • 一个space(0x20),但该空间不是literally解释为(仅)分隔符,而是具有特殊含义;参见下文。

    默认情况下>>:

    • 任何运行
    • 中的[[空格
    和/或 制表符和/或换行符>]被视为字段分隔符

    忽略前导和尾随运行
  • POSIX规范。 uses the abstraction <blank> for spaces and tabs,对于

    all

    语言环境来说是正确的,但是could在特定语言环境中包含additional个字符-我不知道是否存在任何这样的语言环境。
  • 请注意使用默认的输入记录分隔符(<blank>),RS

    换行符通常]不将图片作为字段分隔符输入,因为没有记录包含\n

    作为字段分隔符do的换行符,但是:

    \n设置为导致包含RS实例的记录

      本身
    的值(例如,当\n设置为

  • 空字符串
  • 时;请参见下文) 。Generally,当使用RS函数将字符串拆分为没有显式字段分隔符参数的数组元素时。
  • 即使input records在默认的split()有效的情况下也不会包含\n实例,但是如果在[[multi-来自其他来源的行字符串(例如,通过RS选项传递的变量或作为伪文件名)
      总是
  • split()视为字段分隔符。
  • 重要的非默认注意事项:

      empty

    字符串分配给-v具有特殊含义
    :它以
  • paragraph mode

  • 读取输入,这意味着输入被非空行行,其中空行的开头和结尾行被忽略。当您将[以外的任何内容[[其他分配给\n时,RS的解释从根本上改变
  • A 单个

    字符或指定字符set
  • 中的每个字符被识别为字段分隔符的[[单独]]-而不是runs,与默认值一样。
      例如,将FS设置为FS-即使
    • 有效
    等于一个空格-也会导致将每个记录中的每个individual空间实例视为一个字段分隔符。 要识别行程,必须使用正则表达式量词(重复符号)FS;例如[ ]会将标签的运行识别为单个分隔符。
      [Leading and tailing
    分隔符不会被忽略
    ,而是分隔单独的[[empty字段。
  • +设置为空字符串] >>表示记录的
  • 每个字符
  • 其自己的字段。
  • 作为[\t]+,如果将FS设置为空字符串
  • (段落模式),则将
  • 换行
  • mandated by POSIX)视为also字段分隔符,与RS的值无关。[[1]不幸的是,当您使用强制执行POSIX的选项时,对于字段分隔符,至少达到4.1.3版的GNU Awk符合过时 POSIX标准。 ]):启用该选项并将\n设置为
  • non-empty值,换行符(FS实例)将不被识别为字段分隔符。 GNU Awk手册说明了过时的行为(但忽略了提及,当-P设置为empty
  • 字符串时,该行为不适用)。 POSIX标准在2008年更改为(请参见注释),当--posix具有默认值时,考虑[字段分隔符-因为GNU Awk始终执行without
    RS([C0 ])。这是验证上述行为的2条命令:*在\n有效且RS设置为空字符串
    的情况下,FSstill视为字段分隔符:-P*启用--posix非空
    -P时,RS不被视为字段分隔符-这是过时的行为:\n根据GNU Awk的维护者的说法,
    一个修复程序来了;期望版本为[[4.2(未提供时间范围)。(向@JohnKugelman和@EdMorton求助。)

    gawk -P -F' ' -v RS='' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'问题不明确,但我会尝试回答您可能要问的两个问题。-P变量的默认值(保留字段分隔符,该分隔符告诉awk在读取记录时将记录分成多个字段)是单个空格字符。awk用于将记录分成字段的东西是“字段分隔符”,它是带有某些附加功能的正则表达式,仅在字段分隔符为单个空白字符时才适用。该附加功能是:在拆分字段时,前后空格都将被忽略。字段由连续的空格字符分隔,包括空白,制表符和换行符。如果要使用文字空白字符作为字段分隔符,则必须将其指定为RS,而不能像在正则表达式中那样仅使用独立的文字空白char。除了在读取输入时将字段分隔符用于将记录分为多个字段外,它们还用于其他一些上下文中,例如\n的第三个参数,因此,重要的是要知道哪些上下文需要字符串或regexp或fieldsep,并且手册页中明确指定了每个上下文。此外,以上内容对此进行了解释:

    gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'

    11
    投票

    让我们看一下GNU awk手册页:

    the default delimiter is only space for awk? —输入字段分隔符,默认为空格。请参阅上方的[[Fields。

    1. 字段
    部分!
  • 读取每个输入记录时,gawk使用FS变量的值作为字段分隔符,将记录分成多个字段。如果[ ]是单个字符,则字段由该字符分隔。如果split()为空字符串,则每个单独的字符将成为一个单独的字段。否则,$ echo ' a b c ' | awk '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}' 3: <a> <b> <c> $ echo ' a b c ' | awk -F' ' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}' 3: <a> <b> <c> $ echo ' a b c ' | awk -F'[ ]' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}' 5: <> <a> <b> 应该是完整的正则表达式。在FS是单个空格的特殊情况下,

    字段由空格和/或制表符和/或换行符分隔。


  • 8
    投票

    让我们来看看GNU AWK手册页:

    FS - 输入字段分隔符,默认情况下的空间。见田,上面。

    到田间地头节!

    由于每个输入记录被读取,GAWK拆分成几个域,使用FS变量作为字段分隔符的值。如果FS是单个字符,字段是由字符分隔。如果FS是空字符串,然后每个人性格变得独立的领域。否则,FS有望成为一个完整的正则表达式。在FS是一个单一的空间中的特殊情况下,字段由空格运行和/或突出部和/或换行符分隔。

    © www.soinside.com 2019 - 2024. All rights reserved.