Xóa mọi dòng N trong shell


8

Tôi đang cố gắng xóa một dòng sau N dòng bằng awk và dường như tôi không thể hiểu đúng. Định dạng tập tin là như thế này

YYYYYY
XXXXXX
XXXXXX
YYYYYY
XXXXXX
XXXXXX

Ví dụ thực tế sẽ là

office3
3
1
office3
6
1
office3
6
3
office3
1
1

Làm cách nào tôi có thể xóa các dòng YY hoặc các dòng có nội dung "office". Tôi cần xóa một dòng mỗi hai dòng bất kể nội dung của chúng.


Câu trả lời:


13

Nếu bạn có GNU sed, bạn có thể sử dụng ký hiệu địa chỉ n~m( nbỏ qua m)

sed '1~3d' file

trong đó xóa mọi dòng thứ ba, bắt đầu từ đầu tiên.


Điều này đã giải quyết nó cho tôi. Tôi không biết abot chức năng sed. Cảm ơn bạn!
mormaii2

10

Để chỉ chọn dòng modulo Nvới awkthử

awk '!(NR%2)' file

hoặc là

awk 'NR%3==0' file

Ở đây NRbiểu thị số lượng hàng được xử lý cho đến nay.


Trong trường hợp cụ thể của bạn (xóa tất cả các dòng với Y):

$ echo 'YYYYYY
XXXXXX
XXXXXX
YYYYYY
XXXXXX
XXXXXX' | awk '!(NR%3==1)'
XXXXXX
XXXXXX
XXXXXX
XXXXXX

trong ví dụ này, chúng tôi muốn xóa các dòng 1 và 4, vì vậyNR%3==1
glenn jackman

4
Giải pháp này có ưu điểm là tiêu chuẩn và di động cho tất cả các hệ thống POSIX (ngay cả các hệ thống POSIX trước ngoại trừ hệ thống đầu tiên, nó hoạt động trong bản gốc awktừ năm 1979)
Stéphane Chazelas
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.