AWK:如何删除最后一个模式?

AWK:如何删除最后一个模式?

我有一条路径:

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

我希望有:

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

我已尝试过:

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

但是,我得到的是:

mcc_oriii_after_centering.pdb

答案1

您可以将值设置$NF为空字符串:

$ 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}在开始处理之前将输出字段分隔符设置为与输入字段分隔符相同 - 否则输出将由默认空格而不是斜杠分隔。

至少在 GNU awk 中,您可以通过递减来删除最后一个字段NF(尽管这将给出没有尾随斜杠的输出):

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

您还可以使用 shell 参数扩展来完全避免使用 awk:

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

${parameter%pattern}parameter返回具有最短尾随匹配的shell 变量的值pattern- 例如参见BashGuide:参数扩展

或者直接使用dirname命令。

相关内容