我只想更改特定记录的字段分隔符 ( ),并且我希望使用新的字段分隔符重新计算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 $0
打印修改后的记录。但这是行不通的,因为没有做任何改变记录本身的事情。相反,您必须强制重建记录,通常使用
$1 = $1
[...]
(我正在使用 GNU Awk 5.2.2)
关于
如果您
split()
改为使用该记录,您的代码可能会更清晰/更简单。您混淆了 2 个概念 - 重建 $0 和重新拆分 $0。
重建 $0:当您修改或以其他方式为字段赋值时,$0 将从字段中重建,将每个 FS 替换为 OFS,例如
重新拆分 $0:当您修改或以其他方式为 $0 赋值时(除了由于更改字段而重建它的结果),$0 将使用现有的 FS 值重新拆分为字段,例如
现在试着理解下面的结果,看看你是否理解了上面的说法:
重建然后重新分裂:
重新分裂然后重建:
环顾引用的文字,我看到:
随后是:
从前一句没有提到
FS
而后一句强调,我认为预期的方式是只会$0 = $0
导致重新计算字段;其他人只会导致记录更改以从任何字段的值输出而不会尝试解析它们:请注意,我没有使用 GNU awk:
但我希望 GNU awk 也一样。