Awk – wypisz ostatnią kolumnę lub jedną przed ostatnią, jeśli ostatnia jest pusta

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

  • operand potrójny test ? true : false to sprytny wybór.

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życie basename jest znacznie prostsze.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *