Eliminar todas las líneas excepto la primera aparición

Eliminar todas las líneas excepto la primera aparición

Dado un archivo de texto delimitado por espacios, busque el patrón en la primera columna. Si lo encuentra, mantenga la primera aparición y elimine las otras líneas:

Entrada (patrón = 1234):

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

Rendimiento esperado:

1234    1111    2222
5678    3333    4444
5678    1234    5678

Respuesta1

Por lo tanto, desea imprimir todas las líneas donde el primer campo no es el valor especificado e imprimir la primera línea donde sí coincide.

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

Utiliza el hecho de que las variables awk ( seenen este caso) tienen un valor de 0 inicialmente.

Respuesta2

Mantenga la primera línea coincidente y elimine todas las líneas coincidentes posteriores con GNU sed:

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

Explicación:

/^1234/cuando el búfer de patrón coincide con ^1234

x- intercambiar el patrón y mantener el búfer (en la primera coincidencia, el búfer de retención estará vacío, por lo que el búfer de patrón ahora está, crucialmente, vacío)

/./!- ¿Está vacío el buffer de patrones?

{x;h;b;}- luego intercambie (x) el patrón y mantenga el búfer (esto coloca la línea actual nuevamente en el búfer de patrón), copie el búfer de patrón en el búfer anterior (h) y avance hasta el final de la ejecución para esta línea (b) - es decir, cargue la siguiente línea e inicie el código sed nuevamente. La eliminación final (d) no se ejecuta.

d- después de la primera coincidencia, el buffer de retención contendrá una copia de la línea macthing, por lo que el bloque {x;h;b;} anterior no se ejecutará; en su lugar, la línea actual se elimina, el programa finaliza y se carga la siguiente línea. en el buffer de patrones y el programa comienza de nuevo.

información relacionada