在 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
我正在尝试将 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