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