AWK: Como deletar o último padrão?

AWK: Como deletar o último padrão?

Eu tenho um caminho:

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

Eu quero ter:

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

O que eu tentei:

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}'

Mas o que eu recebo é:

mcc_oriii_after_centering.pdb

Responder1

Você pode definir o valor $NFpara a string vazia:

$ 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}define o separador do campo de saída para ser igual ao separador do campo de entrada antes do início do processamento - caso contrário, a saída será separada pelos espaços padrão em vez de barras.

Pelo menos no GNU awk, você pode excluir completamente o último campo diminuindo NF(embora isso forneça uma saída sem a barra final):

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

Você também pode usar a expansão de parâmetros do shell para evitar completamente o awk:

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

${parameter%pattern}retorna o valor da variável shell parametercom a menor correspondência final patternremovida - veja por exemploBashGuide: Expansão de parâmetros

Ou simplesmente use o dirnamecomando.

informação relacionada