gpt4 book ai didi

linux - awk 的默认字段分隔符

转载 作者:IT王子 更新时间:2023-10-29 00:18:07 25 4
gpt4 key购买 nike

抱歉这个愚蠢的问题,搜索但不确定是否找到了正确的答案,所以默认分隔符只是 awk 的空间?

最佳答案

这是一个 务实总结适用于 所有主要的 awk 实现 :

  • GNU Awk ( gawk ) - 默认 awk在某些 Linux 发行版中
  • Mawk ( mawk ) - 默认 awk在一些 Linux 发行版中(例如,Ubuntu 的早期版本 crysman 报告 19.04 版现在带有 GNU Awk - 请参阅下面的评论。)
  • BSD Awk - 又名 BWK Awk - 默认 awk在类似 BSD 的平台上,包括 OSX

  • 在 Linux 上, awk -W version会告诉你默认的实现 awk是。
    BSD awk 只懂 awk --version (除了 awk -W version 之外,GNU Awk 也能理解)。

    所有这些实现的最新版本都遵循 POSIX standard关于字段分隔符 [1](但不是记录分隔符)。

    词汇表:
  • RS 输入记录分隔符 ,其中描述了 如何将输入分成记录 :
  • POSIX 规定的默认值 换行 ,也称为 \n以下;也就是说,默认情况下输入被分成几行 .
  • awk的命令行,RS可以指定为 -v RS=<sep> .
  • POSIX 限制 RS到文字的单字符值,但 GNU Awk 和 Mawk 支持可以扩展正则表达式的多字符值(BSD Awk 不支持)。
  • FS 输入字段分隔符 ,它描述了如何 每条记录被拆分为字段 ;它可能是一个扩展的正则表达式。
  • awk的命令行,FS可以指定为 -F <sep> (或 -v FS=<sep>)。
  • POSIX-mandated default value形式上是一个空格( 0x20 ),但该空格不按字面解释为(唯一的)分隔符,而是具有特殊含义 ;见下文。


  • 默认 :
  • 任何运行 空格 和/或 标签 和/或 换行被视为 字段分隔符
  • 忽略前导和尾随运行 .

  • POSIX 规范。 uses the abstraction <blank> for spaces and tabs ,这适用于所有语言环境,但可能包含特定语言环境中的其他字符 - 我不知道是否存在任何此类语言环境。

    请注意 使用默认输入记录分隔符 ( RS ), \n , 换行符通常不会作为字段分隔符进入图片 , 因为 没有记录本身包含 \n 在这种情况下。

    换行符作为字段分隔符确实发挥作用 , 然而:
  • RS设置为一个值,导致记录本身包含 \n实例 (例如当 RS 设置为空字符串时;见下文)。
  • 一般来说,当split()函数用于将字符串拆分为没有显式字段分隔符参数的数组元素。
  • 即使输入记录不包含 \n默认情况下的实例 RS有效,split()在来自不同源的多行字符串上没有显式字段分隔符参数的情况下调用函数时(例如,通过 -v 选项传递的变量或作为伪文件名)总是处理 \n作为字段分隔符。


  • 重要的非默认注意事项 :
  • 将空字符串分配给 RS有特殊意义 :它读取 中的输入段落模式 ,意味着输入被 分成记录非空行运行 , 与 忽略空行的前导和尾随运行 .
  • 当您将文字空间以外的任何内容分配给 FS , 解读FS根本变化 :
  • 单个字符或来自指定字符集的每个字符 单独识别为字段分隔符 - 没有运行它,就像默认的一样。
  • 例如,设置 FS[ ] - 即使它实际上相当于一个单独的空间 - 导致每个记录中的每个单独的空间实例都被视为字段分隔符。
  • 要识别运行,正则表达式量词(重复符号)+必须使用;例如,[\t]+会将标签运行识别为单个分隔符。
  • 前导和尾随分隔符不会被忽略 , 而是分隔空字段。
  • 设置 FS到空字符串 意味着 每个字符记录是 自己的领域 .
  • mandated by POSIX , 如果 RS设置为空字符串 (段落模式),换行符 ( \n ) 也被视为字段分隔符 ,与 FS 的值无关.


  • [1] 不幸的是,当您使用选项来强制执行 POSIX 合规性时,GNU Awk 至少在 4.1.3 版之前符合关于字段分隔符的过时 POSIX 标准, -P ( --posix ): 该选项有效且 RS设置为非空值,换行符( \n 实例)不被识别为字段分隔符。 GNU Awk 手册详细说明了过时的行为(但忽略了当 RS 设置为空字符串时它不适用)。 POSIX 标准在 2008 年发生了变化(见评论),当 FS 时也考虑换行字段分隔符。有它的默认值 - 因为 GNU Awk 一直没有 -P ( --posix )。
    以下是验证上述行为的 2 个命令:
    * 与 -P实际上和 RS设置为空字符串, \n仍被视为字段分隔符: gawk -P -F' ' -v RS='' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'* 与 -P有效且非空 RS , \n不被视为字段分隔符 - 这是过时的行为: gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'根据 GNU Awk 维护者的说法,修复即将到来;期待它在 4.2 版(没有给出时间框架)。
    (感谢@JohnKugelman 和@EdMorton 的帮助。)

    关于linux - awk 的默认字段分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com