为什么 awk NF=NF RS= OFS=, 有效?

Why does `awk NF=NF RS= OFS=,` works?

要使用 awk 用逗号替换换行符,您可以使用以下两个调用:

  1. awk -v RS= '{gsub(/\n/,",",[=12=]); print}'
  2. awk NF=NF RS= OFS=,

我了解调用 1 的工作原理,但不了解调用 2 的工作原理。首先,它不遵循使用语法:

awk [OPTINS] [--] PROGRAM [FILE ...]

awk 应将 NF=NF 解释为程序,将 RS=OFS=, 解释为两个输入文件。

它是如何工作的?

这是 awk 中的一个小技巧,它迫使您使用更新的修饰符重新构建 [=12=](在本例中为 RSOFS

请记住,操作的关键是通过设置 RS=OFS=, 来完成的,简单来说就是将默认输入记录分隔符从换行符重置为空并设置输出字段分隔符为 ,,从而将输入中的换行符转换为逗号。

但是你会让awk怎么解释呢?因为这里没有适用的 pattern { action } 部分。如果您只是像下面那样使用 1 暗示所有行的默认 true 操作,则它不起作用。

awk 1 RS= OFS=, file

它不执行任何操作,因为字段 RSOFS 在输入行以某种方式“修改”时适用。它甚至可以是像 rewrite </code> 这样的愚蠢语句,即 <code>{ = }1 用自己覆盖第一列。了解幕后真正发生的事情是,作为修改 </code> 的一部分,即当前行,您可以应用 <code>RSOFS 的值,以防产生您想要的效果。

你展示的那个也是类似的东西。 NF 是由默认字段分隔符分割的行中的列数。所以你故意修改它自己NF=NF,即建议重建,但重建的行基本相同,但是更新了RSOFS或任何配置的修改值。

因此以下任何一项在功能上都是相同的

awk NF=NF RS= OFS=,
awk '{  =  }1' RS= OFS=,