giữ dòng đầu tiên khớp với tìm kiếm chuỗi và xóa tất cả các dòng sau có cùng chuỗi


0

Tôi đang cố gắng giữ dòng đầu tiên khớp với tìm kiếm chuỗi và xóa tất cả các dòng sau có cùng chuỗi.

Có ý kiến ​​gì không?

$ cat example-input.txt
Question one|some other text
Question two|dfgdfgdfgvd
Question one| dfg dfg dfg dfg
Question three|aa bb cc dd eee
Question one|zz aa BB yy qq
Question four|zz xx yy qq

cat example-input.txt | someuniqprogramoroptions "Question one" > example-output.txt

$ cat example-output.txt
Question one|some other text
Question two|dfgdfgdfgvd
Question three|aa bb cc dd eee
Question four|zz xx yy qq
$

CẬP NHẬT: cảm ơn vì mã awk G-Man, bạn là người đàn ông!

$ cat example-input.txt | ./awk-firstlines-only.sh
Question one|some other text
Question two|dfgdfgdfgvd
Question three|aa bb cc dd eee
Question four|zz xx yy qq

1
Chào mừng đến với SU, mike! Bạn có thể cho thấy những gì bạn đang cố gắng (mã), chúng tôi không thể đọc được suy nghĩ của bạn!
duDE

$ cat example-input.txt Câu hỏi một | một số văn bản khác Câu hỏi hai | dfgdfgdfgvd Câu hỏi một | dfg dfg dfg dfg Câu hỏi ba | aa bb cc dd eee Câu hỏi một | zz aa BB yy qq Câu hỏi bốn | zz xx yy qq cat example-input.txt | someuniqueprogramand> Ví dụ-output.txt $ mèo dụ-output.txt Câu hỏi một | một số văn bản khác Câu hỏi hai | dfgdfgdfgvd Câu hỏi ba | aa bb cc đ eee Câu hỏi Bốn | zz xx yy qq $
mike

Vui lòng không trả lời trong các bình luận hoặc bằng cách đăng "câu trả lời" không phải là câu trả lời; chỉnh sửa câu hỏi của bạn để làm cho nó rõ ràng và đầy đủ hơn. Đưa ra một lời giải thích chính xác như bạn có thể.
Scott

cảm ơn, xin lỗi, đây là bài đăng câu hỏi đầu tiên của tôi ở đây, và vẫn đang cố gắng tìm ra cách sử dụng nó - cảm ơn lần nữa
mike

Câu trả lời:


2

Dựa trên ví dụ bạn đã đưa ra, awklệnh này sẽ tạo đầu ra mà bạn yêu cầu:

awk '
    {
        i = index($0, "|")
        if (i == 0) {
                print "Error: line [" $0 "] does not have a \"|\" character."
        } else {
                prefix = substr($0, 1, i-1)
                if (++count[prefix] == 1) print
        }
    }'

Hai dòng mã đầu tiên xác minh rằng mỗi dòng đầu vào chứa a |. Đoạn tiếp theo trích xuất chuỗi trước |ký tự đầu tiên (ví dụ: Câu hỏi một người).  countlà một mảng kết hợp mà chúng ta sử dụng để đếm số lần mỗi tiền tố xuất hiện. Nếu đây là số 1 (nghĩa là lần xuất hiện thứ 1), hãy in dòng; mặt khác, không in gì cả


Hoặc để mặc định thực hiện hầu hết công việc:awk -F'|' '!count[$1]++'
dave_thndry_085

0

Nếu phần đầu tiên có độ dài cố định, một giải pháp ánh sáng thay thế là lệnh uniqkết hợp với sort:

cat example-input.txt | sort | uniq -W 13

Điều này không phù hợp với ví dụ của bạn, vì bạn có độ dài thay đổi và tệp của bạn sẽ được sắp xếp lại, nhưng điều này có thể hữu ích cho các công việc tương tự khi bạn không muốn viết một tập lệnh.


0
perl -nle' /Question one/ and ($count++ or print) or print' example-input.txt

... trên đầu vào của ví dụ OP sẽ tạo ra đầu ra của anh ấy.


Tôi tin rằng OP đã yêu cầu ít nhiều chính xác điều ngược lại với điều này.
nhạc2myear

Câu hỏi không chỉ định phải làm gì với dòng không khớp. Tuy nhiên, ví dụ của ông với đầu vào và đầu ra làm.
Kjetil S.
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.