AWK: ¿Cómo eliminar el último patrón?

AWK: ¿Cómo eliminar el último patrón?

tengo un camino:

/home/alejo/Desktop/Proyecto_UIS-MINCIENCIAS/qmmm_propranolol_aescorcia/A_PSF-NUEVO/ORIII/MCC/out/mcc_oriii_after_centering.pdb

Quiero tener:

/home/alejo/Desktop/Proyecto_UIS-MINCIENCIAS/qmmm_propranolol_aescorcia/A_PSF-NUEVO/ORIII/MCC/out/

Lo que he probado:

a="/home/alejo/Desktop/Proyecto_UIS-MINCIENCIAS/qmmm_propranolol_aescorcia/A_PSF-NUEVO/ORIII/MCC/out/mcc_oriii_after_centering.pdb"
echo $a | awk -F'/' '{print $NF}'

Pero lo que obtengo es:

mcc_oriii_after_centering.pdb

Respuesta1

Puede establecer el valor $NFen la cadena vacía:

$ echo "$a" | awk -F'/' 'BEGIN{OFS=FS} {$NF=""; print}'
/home/alejo/Desktop/Proyecto_UIS-MINCIENCIAS/qmmm_propranolol_aescorcia/A_PSF-NUEVO/ORIII/MCC/out/

BEGIN{OFS=FS}establece el separador de campo de salida para que sea el mismo que el separador de campo de entrada antes del inicio del procesamiento; de lo contrario, la salida se separará mediante espacios predeterminados en lugar de barras.

Al menos en GNU awk, podrías eliminar el último campo por completo disminuyéndolo NF(aunque esto dará un resultado sin la barra diagonal final):

awk -F'/' 'BEGIN{OFS=FS} {NF--; print}'

También puedes usar la expansión de parámetros de shell para evitar awk por completo:

$ echo "${a%/*}/"
/home/alejo/Desktop/Proyecto_UIS-MINCIENCIAS/qmmm_propranolol_aescorcia/A_PSF-NUEVO/ORIII/MCC/out/

${parameter%pattern}devuelve el valor de la variable de shell parametercon la coincidencia final más corta de patterneliminada; consulte, por ejemploBashGuide: Expansión de parámetros

O simplemente use el dirnamecomando.

información relacionada