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 ( seen
neste 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.