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

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

Есть идеи?

$ 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 ответа

Основываясь на приведенном вами примере, это 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-е появление), выведите строку; в противном случае ничего не печатать.

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

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

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

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

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

Другие вопросы по тегам