栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

awk的默认字段分隔符

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

awk的默认字段分隔符

这是适用于 所有主要Awk实现*实用摘要*

  • GNU awk中(
    gawk
    ) -默认
    awk
    一些 Linux发行版
  • Mawk
    mawk
    ) -默认
    awk
    一些 Linux发行版(例如,早期版本的Ubuntu的crysman报道称,版本19.04现在带有 GNU awk中-见下面他的评论)
  • BSD Awk-aka BWK Awk-
    awk
    类似BSD的平台(包括OSX)上的默认设置

在Linux上,

awk -W version
将告诉您默认的实现
awk

BSD awk中 理解
awk --version
(其GNU awk中理解 除了
awk -W version
)。

所有 这些实现的最新版本
遵循POSIX标准,涉及
字段 分隔符

[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授权的默认值是 形式上 一个 空间
      0x20
      ),但空间不是 字面 解释为(只)分离器,但有 特殊的意义
      ; 见下文。

默认情况下

  • 任何运行空间 和/或 突出部 和/或 换行符 被视为 字段分隔符
  • 开头和结尾忽略运行

POSIX规范。对空格和制表符使用抽象

<blank>
,这对于
所有 语言环境都是正确的,但是 可以 在特定语言环境中包含 其他 字符-我不知道是否存在任何此类语言环境。

请注意, 使用默认的输入记录分隔符

RS
)时
n
换行符 通常 不将图片输入为字段分隔符,因为在这种情况下, 记录
本身不 包含
n
在内。

换行符作为字段分隔符 确实 起作用,但是:

  • when
    RS
    设置为一个值,该值导致记录 本身 包含
    n
    实例
    (例如,when
    RS
    设置为 空字符串 ;请参见下文)。
  • 通常 ,当使用该
    split()
    函数将字符串拆分为没有显式字段分隔符参数的数组元素时。
    • 即使 输入记录 不会包含
      n
      实例(如果默认设置
      RS
      有效),该
      split()
      函数在调用时也不会在 来自不同源多行字符串 上使用显式的字段分隔符作为参数(例如,通过
      -v
      option或as 传递的变量)伪文件名) 始终 视为
      n
      字段分隔符。

重要的非默认注意事项

  • 分配 字符串

    RS
    具有特殊的意义:它读取输入 段落模式 ,这意味着输入被分成记录 的运行 非空行 ,用 开头和结尾的忽略空行运行

  • 当你 指定的任何 其他 不是 字面 空间

    FS
    ,该 解释
    FS
    的变化从根本上

    • 单个 字符或者从指定的字符的每个字符 识别 单独 作为一个字段分隔符 -不 运行 它,与默认。
    • 例如,即使将其设置
      FS
      有效地 等于一个空格,也会将每个记录中的每个 单独的 空格实例都视为字段分隔符。
      [ ]
    • 要识别 运行
      +
      必须使用正则表达式量词(重复符号);例如,
      [t]+
      将标签的 运行 识别为单个分隔符。
    • 开头和结尾的 分隔符不会被忽略,而是分隔 字段。
    • 设置
      FS
      空字符串
      意味着记录的 每个 字符 都是 其自己的字段
    • 根据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 }' <<< $'anb'

使用
-P
在效果和 非空
RS
n
不被视为一个字段分隔符-这是过时的行为:根据GNU Awk的维护者的说法,
gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>n", $1, $2 }' <<< $'anb'

修复程序即将到来 ;期望在 4.2 版中使用(未提供时间范围)。
(向@JohnKugelman和@EdMorton表示帮助)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号