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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.