Я пытаюсь сохранить первую строку, которая соответствует строке поиска и удалить все последующие строки, которые совпадают с той же строкой.

Есть идеи?

$ 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
$

ОБНОВЛЕНИЕ: спасибо за код awk G-Man, ты человек!

$ 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

3 ответа3

2

Основываясь на приведенном вами примере, эта команда awk выдаст вывод, который вы запрашиваете:

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
        }
    }'

Первые две строки кода подтверждают, что каждая строка ввода содержит | ,  Следующий извлекает строку перед первым | символ (например, «Вопрос первый»).  count - это ассоциативный массив, который мы используем для подсчета количества появлений каждого префикса.  Если это # 1 (т. Е. 1-е появление), выведите строку; в противном случае ничего не печатать.

0

Если первая часть имеет фиксированную длину, альтернативным легким решением является команда uniq объединенная с sort :

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

Это не очень подходит для вашего примера, так как у вас есть переменная длина, и ваш файл будет переупорядочен, но это может быть удобно для подобных заданий, когда вы не хотите писать скрипт.

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

... на примере ввода ОП будет выдавать его вывод.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .