Chcę użyć AWK
, aby uzyskać nazwa pliku lub nazwa ostatniego folderu, jeśli ciąg jest tylko katalogiem.
Mam:
awk -F "/" "{print $NF}"
wydrukować ostatnią kolumnę i:
awk -F "/" "{print $(NF - 1)}
aby wydrukować jedną kolumnę przed ostatnią.
Jak mogę utworzyć awk
rozpoznaje, czy ciąg zawiera tylko katalog bez nazwy pliku iw tym przypadku wypisuje jedną kolumnę przed ostatnią.
Mój problem polega na tym, że katalog może wyglądać tak:
./folder1/folder2/folder3/
iw tym przypadku ostatnia kolumna byłaby pusta. Chcę, aby awk
rozpoznał to, a następnie wydrukował folder3
(czyli jedną kolumnę przed ostatnią).
Odpowiedź
Możesz użyć operatora if
lub ?:
w tym celu.
awk -F "/" "{print $NF == "" ? $(NF - 1) : $NF}"
awk -F "/" "{if($NF == "") print $(NF - 1); else print $NF}"
Komentarze
Odpowiedź
W przypadku narzędzi GNU zobacz także:
xargs -rd "\n" basename -a --
Które z danych wejściowych list.txt
takich jak:
./folder1/folder2/folder3/ ./foo bar/// /
daje:
folder3 foo bar /
zsh
„s :t
modyfikator (z csh
) daje ""
dla "/"
zamiast "/"
$ printf "<%s>\n" "${(@)${(f)$(<list.txt)}:t}" <folder3> <foo> <bar> <>
Odpowiedź
spróbuj
(Jednak nie byłem w stanie tego przetestować).
Odpowiedź
W powłoce:
$ basename ./folder1/folder2/folder3/ folder3
Przypisywanie do zmiennej za pomocą basename
ze zmienną zawierającą pathname:
filename=$( basename "$pathname" )
Narzędzie basename
jest standardem Narzędzie POSIX .
Komentarze
- thx, moje pytanie zyskało trochę na używaniu
AWK
, użyciebasename
jest znacznie prostsze.
test ? true : false
to sprytny wybór.