Tengo un archivo de texto que contiene:
25 27 50
B 35 75
C 75 78
D 99 88 76
Quería eliminar la línea que no tiene el cuarto campo (el cuarto par de dígitos). Rendimiento esperado :
25 27 50
D 99 88 76
Sé que el comando awk sería la mejor opción para tal tarea, pero me pregunto cuál es el problema con mi comando sed , ya que debería funcionar como puede ver a continuación:
sed -E '/^[ABCD] ([0-9][0-9]) \1$/d' text.txt
Uso de POSIX ERE con referencia inversa (\1) para hacer referencia al patrón anterior entre paréntesis.
He probado este comando en su lugar:
sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt
Pero parece eliminar solo la primera aparición de lo que quiero. Agradecería una mayor explicación de,
Mucho, mucho más fácil con awk
:
awk 'NF == 4' file A 25 27 50 D 99 88 76
Este comando awk
usa un separador de campo predeterminado de espacio o tabulación y verifica una condición NF == 4
para asegurarse de que imprimamos líneas con solo 4 campos.
Con sed
sería (suponiendo que no haya espacios iniciales ni finales en cada línea):
sed -nE '/^[^[:blank:]]+([[:blank:]]+[^[:blank:]]+){3}$/p' file A 25 27 50 D 99 88 76
Con sus muestras mostradas en el programa sed
, puede intentar seguir. Escrito y probado en GNU sed
.
sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file
Explicación: simplemente detener la impresión de líneas mediante la opción -n
de sed
. Luego usando -E
para usar ERE en el programa. En el programa principal, use expresiones regulares para hacer coincidir desde el inicio sin espacio (1 o más ocurrencias) seguido de espacios (1 o más ocurrencias) y este combo 3 veces (para hacer coincidir 3 campos básicamente) que es seguido por no espacios 1 o más ocurrencias hasta final del valor de la línea, si esta expresión regular coincide, imprima esa línea.
Esto podría funcionar para usted (GNU sed):
sed -En 's/\S+/&/4p' file
Desactive la impresión implícita -n
y active la expresión regular extendida -E
.
Sustituya el cuarto campo por sí mismo e imprima el resultado.