javery1289
javery1289

Reputation: 67

Convert n number of rows to columns repeatedly using awk

My data is a large text file that consists of 12 rows repeating. It looks something like this:

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

repeating over and over. I want to turn every 12 rows into columns. so the data would look like this:

{ 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 }

I have found some examples of how to convert all the rows to columns using awk: awk '{printf("%s ", $0)}', but no examples of how to convert every 12 rows into columns and then repeat the process.

Upvotes: 1

Views: 436

Answers (2)

jaypal singh
jaypal singh

Reputation: 77105

Here is an idiomatic way (read golfed down version of Tom Fenech's answer) of doing it with awk:

$ 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 stands for Output Record Separator. We set the ORS to FS which by default is space for every line except the 12th line where we set it to RS which is a newline by default.

Upvotes: 3

Tom Fenech
Tom Fenech

Reputation: 74655

You could use something like this:

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

NR%12 evaluates to true except when the record number is exactly divisible by 0. When it is true, the output field separator is used (which defaults to a space). When it is false, the record separator is used (by default, a newline).

Testing it out:

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

Upvotes: 2

Related Questions