Awk – skriv ut sista kolumnen eller en före sist om sista är emty

Jag vill använda AWK för att få filnamn eller det sista mappnamnet om strängen bara är en katalog.

Jag har:

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

för att skriva ut den sista kolumnen och:

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

för att skriva ut en kolumn före den sista.

Hur kan jag göra awk känna igen om strängen bara innehåller en katalog och inget filnamn och i det här fallet skriva ut en kolumn före den sista.

Mitt problem är att en katalog kan se ut:

./folder1/folder2/folder3/ 

och i det här fallet skulle den sista kolumnen vara tom. Jag vill att awk ska känna igen detta och sedan skriva ut folder3 (så en kolumn före den sista).

Svar

Du kan antingen använda if eller operatorn ?: för detta.

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

Kommentarer

  • ternär operand test ? true : false är ett smart val.

Svar

Med GNU-verktyg se även:

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

Vilket på en list.txt -ingång som:

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

ger:

folder3 foo bar / 

zsh ”s :t modifierare (från csh) ger "" för "/" istället för "/"

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

Svar

försök

(jag kunde dock inte testa det).

Svar

I skalet:

$ basename ./folder1/folder2/folder3/ folder3 

Tilldelning till en variabel med basename med en variabel som innehåller en söknamn:

filename=$( basename "$pathname" ) 

basename -verktyget är en standard POSIX-verktyg .

Kommentarer

  • thx, min fråga har fått lite mycket på användningen av AWK, att använda basename är mycket enklare.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *