mantém a primeira linha que corresponde a uma pesquisa por cadeia de caracteres e remove todas as linhas seguintes que possuem a mesma cadeia de caracteres correspondente

0

Estou tentando manter a primeira linha que corresponde a uma pesquisa de string e remover todas as linhas a seguir que tenham a mesma string correspondida.

Alguma idéia?

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

ATUALIZAÇÃO: obrigado pelo código awk G-Man, você é o cara!

$ 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
    
por mike 11.11.2016 / 16:22

3 respostas

2

Com base no exemplo que você deu, este comando awk produzirá a saída que você está pedindo:

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

As duas primeiras linhas de código verificam se cada linha de entrada contém | . O próximo extrai a string antes do primeiro caractere | (por exemplo, "pergunta um"). count é uma matriz associativa que usamos para contar quantas vezes cada prefixo apareceu. Se este for o nº 1 (ou seja, a primeira aparição), imprima a linha; caso contrário, não imprima nada.

    
por 11.11.2016 / 21:19
0

Se a primeira parte tiver um comprimento fixo, uma solução alternativa de luz será o comando uniq combinado com sort :

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

Isso não é muito apropriado para o seu exemplo, já que você tem um comprimento variável e seu arquivo será reordenado, mas isso pode ser útil para tarefas semelhantes quando você não deseja escrever um script.

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

... no exemplo de entrada de OPs produzirá sua saída.

    
por 20.01.2017 / 14:12