Awk – skriv ut siste kolonne eller en før siste hvis siste er emty

Jeg vil bruke AWK for å få filnavn eller det siste mappenavnet hvis strengen bare er en katalog.

Jeg har:

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

for å skrive ut den siste kolonnen og:

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

for å skrive ut en kolonne før den siste.

Hvordan kan jeg lage awk gjenkjenne hvis strengen bare inneholder en katalog og ikke noe filnavn og i dette tilfellet skrive ut en kolonne før den siste.

Problemet mitt er at en katalog kan se ut som:

./folder1/folder2/folder3/ 

og i dette tilfellet ville den siste kolonnen være tom. Jeg vil at awk skal gjenkjenne dette og deretter skrive ut folder3 (altså en kolonne før den siste).

Svar

Du kan enten bruke if eller operatøren ?: for dette.

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

Kommentarer

  • ternær operand test ? true : false er et smart valg.

Svar

Med GNU-verktøy, se også:

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

Som på en list.txt -inngang som:

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

gir:

folder3 foo bar / 

zsh «s :t modifikator (fra csh) gir "" for "/" i stedet for "/"

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

Svar

prøv

(jeg kunne ikke teste det skjønt).

Svar

I skallet:

$ basename ./folder1/folder2/folder3/ folder3 

Tilordne til en variabel ved å bruke basename med en variabel som inneholder en stinavn:

filename=$( basename "$pathname" ) 

basename verktøyet er POSIX-verktøy .

Kommentarer

  • thx, spørsmålet mitt har fått litt mye på bruken av AWK, å bruke basename er mye enklere.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *