awk 三元运算中的布尔逻辑

问题描述 投票:0回答:1

我有一堆 3 列 13 行的数字

7,4 15,9 77,5  
54,4 28,1 18,8  
46,2 28,1 26,7  
38,5 30,3 32,4  
40,1 31,9 29  
32,6 36 32,7  
41,4 33 27   
65,5 24,9 11,8  
44 30 28,1  
42,1 34,8 25,3  
49,1 30,9 22,1  
37,4 25,3 39,1  
50,5 26,1 23,4  

以下是想要的最终结果

7,4 15,9 77,5  
54,4 28,1 18,8  
46,2 28,1 26,7  
  
38,5 30,3 32,4  
40,1 31,9 29  
32,6 36 32,7  
  
41,4 33 27   
65,5 24,9 11,8   
44 30 28,1  
  
42,1 34,8 25,3  
49,1 30,9 22,1  
37,4 25,3 39,1  
50,5 26,1 23,4  

我已经设法使用 awk 获得了结果,如下所示:

awk 'ORS = (NR % 3 || NR == 12 ? RS : RS RS)' v7.txt > v8.txt

我现在的问题是,我不明白为什么

NR % 3 || NR == 12
会这样。前 11 行在我需要的地方产生额外的换行符。在第 12 行之后我不需要额外的换行符,所以我已经按照我想要的方式对数字进行了分组,我对此感到满意。

我在玩的时候发现了这个解决方案。有人可以解释一下这个小 awk 命令到底是做什么的吗?

awk boolean logic
1个回答
0
投票

这个答案假设您正在使用 GNU

AWK
,如果这不成立,请完全忽略它。

awk 'ORS = (NR % 3 || NR == 12 ? RS : RS RS)' v7.txt > v8.txt

解释一下这个小 awk 命令到底是做什么的。

ORS
RS
NR
是内置变量,如下

  • 输出记录分隔符,描述如何在输出中剪切行,该字符串跟随您输入要打印的文本,默认为换行符(
    \n
  • 记录分隔符,描述如何解析行,默认为换行符(
    \n
    )
  • 记录数,第1行1条,第2行2条,第3行3条,依此类推

进一步阅读 8 个强大的 Awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

请注意,您永远不会更改

RS
值,因此上面的代码相当于更详细

awk 'ORS = (NR % 3 || NR == 12 ? "\n" : "\n\n")' v7.txt > v8.txt

condition?value1:value2
就是所谓的三元运算符,意思是如果条件成立则使用value1,否则使用value2。
%
trunc-mod,在 GNU Awk 用户指南中描述如下

计算

x % y
的余数时,商会四舍五入 趋向于零到整数并乘以 y

此运算的结果与逻辑 OR (

||
) 一起使用,在这种情况下,GNU
AWK
确实将 0 视为 false,将任何其他值视为 true。因此这段代码实现了以下过程: 如果行数不能被 3 整除或者行数等于 12,则使用默认行结尾(
\n
),否则使用双倍行结尾(
\n\n
)。

© www.soinside.com 2019 - 2024. All rights reserved.