Awk – vytiskne poslední sloupec nebo jeden před posledním, pokud je last prázdný

Chci použít AWK k získání název souboru nebo název poslední složky, pokud je řetězec pouze adresář.

Mám:

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

k tisku posledního sloupce a:

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

vytisknout jeden sloupec před posledním.

Jak mohu vytvořit awk rozpoznat, zda řetězec obsahuje pouze adresář a žádný název souboru, a v takovém případě vytisknout jeden sloupec před posledním.

Můj problém je, že adresář může vypadat takto:

./folder1/folder2/folder3/ 

a v tomto případě bude poslední sloupec prázdný. Chci, aby to awk rozpoznalo a poté vytisklo folder3 (tedy jeden sloupec před posledním).

Odpověď

Můžete použít buď if nebo operátor ?: k tomu.

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

Komentáře

  • ternární operand test ? true : false je chytrá volba.

Odpověď

S nástroji GNU viz také:

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

Které na vstupu list.txt jako:

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

dává:

folder3 foo bar / 

zsh „s :t modifikátor (z csh) dává "" pro "/" místo "/"

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

odpověď

vyzkoušet

(Přesto jsem to nemohl vyzkoušet).

Odpovědět

V prostředí:

$ basename ./folder1/folder2/folder3/ folder3 

Přiřazení k proměnné pomocí basename s proměnnou, která obsahuje cesta:

filename=$( basename "$pathname" ) 

Nástroj basename je standardní Obslužný program POSIX .

Komentáře

  • thx, moje otázka trochu získává použití AWK je použití basename mnohem jednodušší.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *