2009-06-10 35 views

Trả lời

17
awk '{ if ((NR % 5) == 0) printf("\n"); print; }' 

cho n == 5, tất nhiên. Thay thế ý tưởng của bạn là n.

+0

Nếu n = 1, sau đây dường như làm việc: 'awk '{print; printf ("\ n");} ''hoặc đơn giản là ' awk '{print; print "";} '' –

+0

Điều này sẽ đặt dòng mới đầu tiên trước dòng thứ 5 thay vì sau. in và printf cần phải được đảo ngược .. – Scrutinizer

1
$ awk -v n=5 '$0=(!(NR%n))?"\n"$0:$0' 

Nếu bạn muốn thay đổi 'n', vui lòng đặt tham số 'n' theo tùy chọn awk's -v.

+0

Điều đó sẽ có vấn đề khi một dòng trống hoặc bao gồm một số không. – Scrutinizer

24

Một hơn "awk-ish" cách để viết câu trả lời smcameron của:

awk -v n=5 '1; NR % n == 0 {print ""}' 

Các "1"; là điều kiện luôn đúng và sẽ kích hoạt hành động mặc định để in dòng hiện tại.

+0

Tương tự ở đây, phải không? in dòng và in dòng mới sẽ cần phải được đảo ngược, nếu không dòng mới được in trước mỗi dòng 5 thay vì sau khi nó. – Scrutinizer

+0

Khá đúng. đã cập nhật. –

+3

Tôi có lẽ sẽ viết đó là ''{print} NR% n == 0 {print" "}', nhưng đó hoàn toàn là một vấn đề về phong cách. – Vatine

3
awk '{print; if (FNR % 5 == 0) printf "\n";}' your_file 

Tôi đoán 'in' phải trước 'printf' và FNR chính xác hơn cho công việc của bạn.

3

More awkishness:

awk 'ORS=NR%5?RS:RS RS' 

Ví dụ:

$ printf "%s\n" {1..12} | awk 'ORS=NR%5?RS:RS RS' 
1 
2 
3 
4 
5 

6 
7 
8 
9 
10 

11 
12 
Các vấn đề liên quan