Próbuję użyć, awk
aby uzyskać nazwę pliku podaną bezwzględną ścieżką do pliku.
Na przykład, mając ścieżkę wejściową, /home/parent/child/filename
którą chciałbym uzyskać filename
, próbowałem:
awk -F "/" '{print $5}' input
który działa doskonale.
Jednak jestem twardym kodem, $5
który byłby nieprawidłowy, gdyby moje dane wejściowe miały następującą strukturę:
/home/parent/child1/child2/filename
Tak więc ogólne rozwiązanie wymaga zawsze zajęcia ostatniego pola (które będzie nazwą pliku).
Czy istnieje prosty sposób na zrobienie tego za pomocą funkcji awk substr?
basename
jest oficjalnym sposobem robienia tego, używanieawk
do tego nie jest dobre, mówiąc lekko. : DOdpowiedzi:
Skorzystaj z faktu, że
awk
dzieli linie w polach na podstawie separatora pól, który możesz zdefiniować. Dlatego definiując separator pól/
, możesz powiedzieć:w
NF
odniesieniu do liczby pól aktualnego rekordu drukowanie$NF
oznacza wydrukowanie ostatniego.Więc mając plik taki jak ten:
Byłby to wynik:
źródło
$(NF-1)
.W takim przypadku lepiej jest użyć
basename
zamiastawk
:źródło
dirname
robi odwrotnie i usuwa plik, a nie ścieżkę.Inną opcją jest użycie
bash
zastępowania parametrów .źródło
Jeśli jesteś otwarty na rozwiązanie Perla, oto jedno podobne do rozwiązania awk Fedorqui:
-F/
określa,/
że separator pól$F[-1]
jest ostatnim elementem@F
tablicy autosplitźródło
Powinien to być komentarz do odpowiedzi basename, ale nie mam wystarczającej uwagi.
Jeśli nie użyjesz cudzysłowów,
basename
nie będzie działać ze ścieżką zawierającą znak spacji:ok z cudzysłowami „”
przykład pliku
źródło
Wiem, że spóźniłem się o 3 lata, ale ... powinieneś rozważyć rozszerzenie parametrów, jest wbudowane i szybsze.
jeśli twoje dane wejściowe są w zmiennej, powiedzmy, $ var1, po prostu zrób
${var1##*/}
. Zobacz poniżejźródło
Jak 5 lat później, wiem, dzięki za wszystkie propozycje, robiłem to w następujący sposób:
Cieszę się, że są lepsze maniery
źródło
Możesz także użyć:
lub
źródło