Awk – drucke die letzte Spalte oder eine vorletzte, wenn die letzte leer ist

Ich möchte AWK verwenden, um die zu erhalten Dateiname oder der Name des letzten Ordners, wenn die Zeichenfolge nur ein Verzeichnis ist.

Ich habe:

 awk -F "/" "{print $NF}" 

, um die letzte Spalte zu drucken und:

 awk -F "/" "{print $(NF - 1)} 

, um eine Spalte vor der letzten zu drucken.

Wie kann ich awk erstellen? Erkennen Sie, ob die Zeichenfolge nur ein Verzeichnis und keinen Dateinamen enthält, und drucken Sie in diesem Fall eine Spalte vor der letzten.

Mein Problem ist, dass ein Verzeichnis möglicherweise folgendermaßen aussieht:

./folder1/folder2/folder3/ 

und in diesem Fall wäre die letzte Spalte leer. Ich möchte, dass awk dies erkennt und dann folder3 (also eine Spalte vor der letzten) druckt.

Antwort

Sie können entweder if oder den Operator ?: verwenden hierfür.

awk -F "/" "{print $NF == "" ? $(NF - 1) : $NF}" 
awk -F "/" "{if($NF == "") print $(NF - 1); else print $NF}" 

Kommentare

  • Der ternäre Operand test ? true : false ist eine clevere Wahl.

Antwort

Bei GNU-Dienstprogrammen siehe auch:

xargs -rd "\n" basename -a -- 

Welche auf einer list.txt -Eingabe wie:

./folder1/folder2/folder3/ ./foo bar/// / 

ergibt:

folder3 foo bar / 

zsh „s :t (von csh) gibt "" für "/" anstelle von "/"

$ printf "<%s>\n" "${(@)${(f)$(<list.txt)}:t}" <folder3> <foo> <bar> <> 

Antwort

versuchen

(ich konnte es jedoch nicht testen).

Antwort

In der Shell:

$ basename ./folder1/folder2/folder3/ folder3 

Zuweisen zu einer Variablen mithilfe von basename mit einer Variablen, die a enthält Pfadname:

filename=$( basename "$pathname" ) 

Das Dienstprogramm basename ist ein Standard POSIX-Dienstprogramm .

Kommentare

  • Danke, meine Frage hat bei der Verwendung von Die Verwendung von basename ist viel einfacher.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.