AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 748740
Accepted
Sebastian Carlos
Sebastian Carlos
Asked: 2023-06-13 18:27:35 +0800 CST2023-06-13 18:27:35 +0800 CST 2023-06-13 18:27:35 +0800 CST

以编程方式更改字段分隔符(FS)并重新计算 gawk 中的当前记录?

  • 772

我只想更改特定记录的字段分隔符 ( ),并且我希望使用新的字段分隔符重新计算FS记录 ( $0)、字段 ( $N) 和字段数 ( )。NF但这似乎不起作用。

示例:这里我有一行被解释为由空格分隔的三个字段。如果我将字段分隔符更改为n并强制重新构造记录 ( $1 = $1),记录将保持不变,如打印所示$1:

$ echo 'one two three' | awk '1 {FS="n" ; OFS=":" ; $1 = $1 ; print $1}'
> one

但我希望输出是:

> o

通过运行强制重新构造记录的技巧$1 = $1取自gawk 手册。所以我希望它能起作用。我不确定可能是什么问题:

尝试简单地通过设置FS和更改记录中的字段分隔符是一个常见的错误OFS,然后期望一个普通的print或print $0打印修改后的记录。

但这是行不通的,因为没有做任何改变记录本身的事情。相反,您必须强制重建记录,通常使用$1 = $1[...]

(我正在使用 GNU Awk 5.2.2)

awk
  • 2 2 个回答
  • 483 Views

2 个回答

  • Voted
  1. Best Answer
    Ed Morton
    2023-06-13T20:41:03+08:002023-06-13T20:41:03+08:00

    关于

    我只想更改特定记录的字段分隔符 (FS)

    如果您split()改为使用该记录,您的代码可能会更清晰/更简单。

    您混淆了 2 个概念 - 重建 $0 和重新拆分 $0。

    重建 $0:当您修改或以其他方式为字段赋值时,$0 将从字段中重建,将每个 FS 替换为 OFS,例如

    $ echo 'one two three' |
        awk '{FS="n" ; OFS=":" ; $1 = $1 ; print; for (i=1; i<=NF; i++) print i, $i}'
    one:two:three
    1:one
    2:two
    3:three
    

    重新拆分 $0:当您修改或以其他方式为 $0 赋值时(除了由于更改字段而重建它的结果),$0 将使用现有的 FS 值重新拆分为字段,例如

    $ echo 'one two three' |
        awk '{FS="n" ; OFS=":" ; $0 = $0 ; print; for (i=1; i<=NF; i++) print i, $i}'
    one two three
    1:o
    2:e two three
    

    现在试着理解下面的结果,看看你是否理解了上面的说法:

    重建然后重新分裂:

    $ echo 'one two three' |
        awk '{FS="n" ; OFS=":" ; $1 = $1 ; $0 = $0; print; for (i=1; i<=NF; i++) print i, $i}'
    one:two:three
    1:o
    2:e:two:three
    

    重新分裂然后重建:

    $ echo 'one two three' |
        awk '{FS="n" ; OFS=":" ; $0 = $0; $1 = $1 ; print; for (i=1; i<=NF; i++) print i, $i}'
    o:e two three
    1:o
    2:e two three
    
    • 10
  2. muru
    2023-06-13T18:50:08+08:002023-06-13T18:50:08+08:00

    环顾引用的文字,我看到:

    最后,有时awk使用字段的当前值和 来强制重建整个记录很方便OFS。

    随后是:

    $0和字段之间的关系有另一面。对 的任何赋值都会导致使用 的当前值$0将记录重新解析为字段。FS

    从前一句没有提到FS而后一句强调,我认为预期的方式是只会$0 = $0导致重新计算字段;其他人只会导致记录更改以从任何字段的值输出而不会尝试解析它们:

    % echo 'one two three' | awk '1 {FS="n" ; OFS=":" ; $0 = $0 ; print $1}'
    o
    
    % echo 'one two three' | awk '{FS="n" ; OFS=":" ; $1 = $1 ; print}'
    one:two:three
    

    请注意,我没有使用 GNU awk:

    % awk --version
    awk version 20200816
    

    但我希望 GNU awk 也一样。

    • 7

相关问题

  • 根据第一个逗号之前的匹配删除重复行数

  • 在另一个文件之后逐行追加行

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve