使用awk重复将n行数转换为列

时间:2014-09-17 22:31:45

标签: awk csh gawk

我的数据是一个大型文本文件,由12行重复组成。它看起来像这样:

{
1
2
3
4
5
6
7
8
9
10
}

一遍又一遍地重复。我想将每12行转换成列。所以数据看起来像这样:

{ 1 2 3 4 5 6 7 8 9 10 }
{ 1 2 3 4 5 6 7 8 9 10 }
{ 1 2 3 4 5 6 7 8 9 10 }

我找到了一些如何使用awk:awk '{printf("%s ", $0)}'将所有行转换为列的示例,但没有关于如何将每12行转换为列然后重复该过程的示例。

2 个答案:

答案 0 :(得分:3)

使用awk执行此操作的惯用方法(阅读高尔夫版本的Tom Fenech's答案):

$ awk '{ORS=(NR%12?FS:RS)}1' file
{ 1 2 3 4 5 6 7 8 9 10 }
{ 1 2 3 4 5 6 7 8 9 10 }
{ 1 2 3 4 5 6 7 8 9 10 }

ORS代表输出记录分隔符。我们将ORS设置为FS,默认情况下,除第12行之外的每一行都有空格,我们将其设置为RS,默认为换行符。

答案 1 :(得分:2)

您可以使用以下内容:

awk '{printf "%s%s", $0, (NR%12?OFS:RS)}' file

NR%12计算结果为true,除非记录号可以被0整除。如果为真,则使用输出字段分隔符(默认为空格)。如果为false,则使用记录分隔符(默认情况下为换行符)。

测试出来:

$ awk '{printf "%s%s", $0, (NR%12?OFS:RS)}' file
{ 1 2 3 4 5 6 7 8 9 10 }