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

299
mike

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

Есть идеи?

$ 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 
0
Добро пожаловать в Су, Майк! Можете ли вы показать, пожалуйста, что вы пытаетесь (код), мы не можем прочитать ваши мысли! duDE 7 лет назад 1
$ cat example-input.txt Вопрос первый | какой-то другой текст Вопрос второй | dfgdfgdfgvd Вопрос первый | dfg dfg dfg dfg Вопрос третий | aa bb cc dd eee Вопрос первый | zz aa BB yy qq Вопрос четыре | zz xx yy qq cat example-input.txt | someuniqueprogramand> example-output.txt $ cat example-output.txt Вопрос первый | какой-то другой текст Вопрос второй | dfgdfgdfgvd Вопрос третий | aa bb cc dd eee Вопрос четыре | zz xx yy qq $ mike 7 лет назад 0
Пожалуйста, не отвечайте в комментариях или размещая «ответы», которые не являются ответами; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. Дайте как можно более точное объяснение. Scott 7 лет назад 0
спасибо, извините, это мой первый пост здесь, и я все еще пытаюсь понять, как его использовать - еще раз спасибо mike 7 лет назад 0

3 ответа на вопрос

2
G-Man

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

Или пусть по умолчанию выполняет большую часть работы: `awk -F '|' '! Подсчитывать [$ 1] ++' ` dave_thompson_085 7 лет назад 0
0
Joce

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

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

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

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

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

Я полагаю, что OP требовал более или менее полной противоположности этому. music2myear 7 лет назад 0
Вопрос не уточнил, что делать с несоответствующей строкой. Однако его пример с вводом и выводом делают. Kjetil S. 7 лет назад 0