AWK: Wie lösche ich das letzte Muster?

AWK: Wie lösche ich das letzte Muster?

Ich habe einen Pfad:

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

Ich möchte haben:

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

Was ich versucht habe:

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

Aber was ich bekomme ist:

mcc_oriii_after_centering.pdb

Antwort1

Sie können den Wert $NFauf eine leere Zeichenfolge setzen:

$ 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}Legt fest, dass der Ausgabefeldtrenner mit dem Eingabefeldtrenner vor Beginn der Verarbeitung übereinstimmt. Andernfalls wird die Ausgabe durch die Standardleerzeichen statt durch Schrägstriche getrennt.

Zumindest in GNU awk könnten Sie stattdessen das letzte Feld durch Dekrementieren vollständig löschen NF(obwohl dies eine Ausgabe ohne den abschließenden Schrägstrich ergibt):

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

Sie können auch die Shell-Parametererweiterung verwenden, um awk vollständig zu vermeiden:

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

${parameter%pattern}gibt den Wert der Shell-Variable parametermit der kürzesten nachfolgenden Übereinstimmung von patternentfernt zurück - siehe zum BeispielBashGuide: Parametererweiterung

Oder verwenden Sie einfach den dirnameBefehl.

verwandte Informationen