Сохранить первую строку, которая соответствует строке поиска и удалить все последующие строки, которые совпадают с той же строкой
Я пытаюсь сохранить первую строку, которая соответствует строке поиска и удалить все последующие строки, которые совпадают одинаковые строки.
Есть идеи?
$ 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
Это не очень подходит для вашего примера, так как у вас есть переменная длина, и ваш файл будет переупорядочен, но это может быть удобно для подобных заданий, когда вы не хотите писать скрипт.