我有一堆 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 命令到底是做什么的吗?
这个答案假设您正在使用 GNU
AWK
,如果这不成立,请完全忽略它。
awk 'ORS = (NR % 3 || NR == 12 ? RS : RS RS)' v7.txt > v8.txt
解释一下这个小 awk 命令到底是做什么的。
ORS
和 RS
和 NR
是内置变量,如下
\n
)\n
)进一步阅读 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 用户指南中描述如下
计算
的余数时,商会四舍五入 趋向于零到整数并乘以 y。x % y
此运算的结果与逻辑 OR (
||
) 一起使用,在这种情况下,GNU AWK
确实将 0 视为 false,将任何其他值视为 true。因此这段代码实现了以下过程:
如果行数不能被 3 整除或者行数等于 12,则使用默认行结尾(\n
),否则使用双倍行结尾(\n\n
)。