Awk – print laatste kolom of één voor laatste als laatste leeg is

Ik wil AWK gebruiken om de bestandsnaam of de naam van de laatste map als de tekenreeks alleen een map is.

Ik heb:

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

om de laatste kolom af te drukken en:

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

om één kolom voor de laatste af te drukken.

Hoe kan ik awk herken of de string alleen een map en geen bestandsnaam bevat en in dit geval één kolom voor de laatste afdrukken.

Mijn probleem is dat een map er als volgt uit kan zien:

./folder1/folder2/folder3/ 

en in dit geval zou de laatste kolom leeg zijn. Ik wil dat awk dit herkent en vervolgens folder3 afdrukt (dus een kolom voor de laatste).

Answer

Je kunt if of de ?: operator gebruiken hiervoor.

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

Reacties

  • ternaire operand test ? true : false is een slimme keuze.

Antwoord

Zie ook voor GNU-hulpprogrammas:

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

Welke op een list.txt invoer zoals:

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

geeft:

folder3 foo bar / 

zsh “s :t modifier (van csh) geeft "" voor "/" in plaats van "/"

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

Antwoord

probeer

(ik kon het echter niet “testen).

Antwoord

In de shell:

$ basename ./folder1/folder2/folder3/ folder3 

Toewijzen aan een variabele, gebruik basename met een variabele die een padnaam:

filename=$( basename "$pathname" ) 

Het basename hulpprogramma is een standaard POSIX-hulpprogramma .

Reacties

  • thx, mijn vraag wint een beetje aan het gebruik van AWK, het gebruik van basename is veel eenvoudiger.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *