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
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šší.
test ? true : false
je chytrá volba.