在 awk 中将 1xA table 转换为 BxC table

Transform a 1xA table into a BxC table in awk

我正在尝试将 1xA table 变成 BxC table。假设 A 是 15,B 是 3,C 是 5,因此在每 5 个条目之后我希望它在同一个 table 中开始一个新行。

我有一个相当乏味的方法,它看起来很接近,因为它在每 5 之后遗漏了一些值。我认为问题出在 RS,因为新行忘记了 "space" 所需的 "space" RS,但我尝试在 file.sum 中将其更改为其他内容,但仍然没有成功。也许有更好的方法来做到这一点,但觉得这应该有效。

awk -v RS=" " '{getline a1; getline a2; getline a3; getline a4; getline a5; print a1,a2,a3,a4,a5}' OFS='\t' file.sum

file.sum(我的 1xA):

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

预期结果(我的 BxC):

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15

实际结果:

1  2  3  4  5
7  8  9  10 11
13 14 15 10 11

这应该是最简单的解决方案之一:

xargs -n5 <file
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

跟进您的 awk。我不喜欢 getline 所以我总是尽量避免它。循环也会减慢 awk 一些。

但是使用 RS=" " 你可以这样做:

awk -v RS=" " '{=} {printf NR%5==0?"%s\n":"%s ",[=11=]}' file
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

您可以删除 {=},但最后会出现一个空行。
NR%5==0 测试是否每 5 条记录一次,并在需要时插入换行符。

标签版:

awk -v RS=" " '{=} {printf NR%5==0?"%s\n":"%s\t",[=12=]}' file
1       2       3       4       5
6       7       8       9       10
11      12      13      14      15