Awk – udskriv sidste kolonne eller en før sidste, hvis sidste er emty

Jeg vil bruge AWK for at få filnavn eller det sidste mappenavn, hvis strengen kun er et bibliotek.

Jeg har:

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

til at udskrive den sidste kolonne og:

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

for at udskrive en kolonne før den sidste.

Hvordan kan jeg lave awk genkende, om strengen kun indeholder et bibliotek og intet filnavn og i dette tilfælde udskrive en kolonne før den sidste.

Mit problem er, at en mappe kan se ud:

./folder1/folder2/folder3/ 

og i dette tilfælde ville den sidste kolonne være tom. Jeg vil have awk til at genkende dette og derefter udskrive folder3 (så en kolonne før den sidste).

Svar

Du kan enten bruge if eller ?: -operatøren til 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 klogt valg.

Svar

Med GNU-hjælpeprogrammer se også:

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

Hvilket på en list.txt -indgang som:

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

giver:

folder3 foo bar / 

zsh “s :t modifikator (fra csh) giver "" til "/" i stedet for "/"

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

Svar

prøv

(jeg kunne dog ikke teste det).

Svar

I skallen:

$ basename ./folder1/folder2/folder3/ folder3 

Tildeling til en variabel ved hjælp af basename med en variabel, der indeholder en stienavn:

filename=$( basename "$pathname" ) 

basename -værktøjet er POSIX-værktøj .

Kommentarer

  • thx, mit spørgsmål har fået lidt meget på brugen af AWK at bruge basename er meget enklere.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *