Chèn một dòng mới sau mỗi N dòng?


24

Làm cách nào tôi có thể sử dụng các công cụ xử lý văn bản để chèn một dòng mới sau mỗi N dòng?

Ví dụ cho N = 2:

ĐẦU VÀO:

sadf
asdf
yxcv
cxv
eqrt
asdf

ĐẦU RA:

sadf
asdf

yxcv
cxv

eqrt
asdf

Câu trả lời:


28

Với awk:

awk ' {print;} NR % 2 == 0 { print ""; }' inputfile

Với sed( GNUphần mở rộng):

sed '0~2 a\\' inputfile

Với bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"

2
Đánh giá số học có thể được sử dụng trực tiếp như điều kiện, không cần phải [[ ]]kiểm tra : while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork

1
Xin lưu ý rằng lệnh được ghi lại ở trên sed '0~2 a\ 'sẽ thêm một khoảng trắng cho mỗi dòng mới được chèn. Nếu bạn muốn thêm một dòng mới sau mỗi dòng, bất kỳ những công việc tương tự: sed '0~1 a\ ', sed 'a\ ', hoặc chỉ sed G.
Acumenus


4
sed n\;G <infile

... là tất cả những gì bạn cần ...

Ví dụ:

seq 6 | sed n\;G

ĐẦU RA:

1
2

3
4

5
6

... (và một khoảng trống cũng theo sau 6) ... hoặc ...

seq 5 | sed n\;G

ĐẦU RA:

1
2

3
4

5

(và không có khoảng trống nào sau 5)

Nếu một khoảng trống phải luôn được bỏ qua trong trường hợp dòng cuối cùng:

sed 'n;$!G' <infile

2

Một hương vị awk khác:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'

1
"Câu trả lời này được gắn cờ là chất lượng thấp vì độ dài và nội dung của nó." Tôi sẽ chấp nhận nó ... ;-)
Hauke ​​Laging 27/1/2015

1

sed (GNU)

Với (GNU) sed:

sed '0~2G'

Ngắn (xấu cho N = 100):

sed 'n;G'

người đàn ông sed giải thích ~ như:

đầu tiên ~ bước
Ghép từng dòng của bước bắt đầu với dòng đầu tiên. Ví dụ, `` sed -n 1 ~ 2p '' sẽ in tất cả các dòng được đánh số lẻ trong luồng đầu vào và địa chỉ 2 ~ 5 sẽ khớp với mỗi dòng thứ năm, bắt đầu bằng dòng thứ hai. đầu tiên có thể bằng không; trong trường hợp này, sed hoạt động như thể nó bằng bước. (Đây là một phần mở rộng.)

sed (khác)

Với sed khác (Đếm dòng mới):

sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'

Hoặc, để dễ di chuyển hơn, được viết dưới dạng (xóa nhận xét cho một số phiên bản của sed):

sed -e '             # Start a sed script.
         p            # Whatever happens later, print the line.
         s/.*//       # Clean the pattern space.
         H            # Add **one** newline to hold space.
         x            # Get the hold space to examine it, now is empty.
         /\n\{2\}/{   # Test if there are 2 new lines counted.
             g        # Erase the newline count.
             p        # Print an additional new line.
           }          # End the test.
         x            # match the `x` done above.
         d            # don't print anything else. Re-start.
       '              # End sed script.

ôi

Với awk, có lẽ:

awk '1 ; NR%2==0 {printf"\n"} '
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.