Exclua todas as linhas, exceto a primeira ocorrência

Exclua todas as linhas, exceto a primeira ocorrência

Dado um arquivo de texto delimitado por espaço, procure o padrão na primeira coluna. Se encontrado, mantenha a primeira ocorrência e exclua as demais linhas:

Entrada (padrão = 1234):

1234    1111    2222
5678    3333    4444
1234    5678    9012
5678    1234    5678
1234    9786    5432

Resultado esperado:

1234    1111    2222
5678    3333    4444
5678    1234    5678

Responder1

Então você deseja imprimir todas as linhas onde o primeiro campo não é o valor especificado e imprimir a primeira linha onde ele corresponde.

awk -vF="$1" '{ if ($1 != F) { print; } else {if (!seen) { print ; seen=1}}}'

Usa o fato de que variáveis ​​​​awk ( seenneste caso) têm valor 0 inicialmente.

Responder2

Mantenha a primeira linha correspondente e remova todas as linhas correspondentes subsequentes com GNU sed:

sed -e '/^1234/{x;/./!{x;h;b;};d}' file

Explicação:

/^1234/quando o buffer padrão corresponde a ^1234

x- troque o padrão e o buffer de retenção (na primeira partida, o buffer de retenção estará vazio, então o buffer de padrão agora está, crucialmente, vazio)

/./!- O buffer de padrão agora está vazio?

{x;h;b;}- então troque (x) o padrão e mantenha o buffer (isso coloca a linha atual de volta no buffer de padrão), copie o buffer de padrão no buffer antigo (h) e ramifique até o final da execução desta linha (b) - ou seja, carregue a próxima linha e inicie o código sed novamente. A exclusão final (d) não é executada.

d- após a primeira correspondência, o buffer de retenção conterá uma cópia da linha macthing, então o bloco {x;h;b;} acima não será executado - em vez disso, a linha atual será excluída, o programa terminará, a próxima linha será carregada no buffer padrão e o programa inicia novamente.

informação relacionada