Awk – tipăriți ultima coloană sau una înainte de ultima dacă ultima este emty

Vreau să folosesc AWK pentru a obține numele fișierului sau numele ultimului dosar dacă șirul este doar un director.

Am:

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

pentru a imprima ultima coloană și:

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

pentru a imprima o coloană înainte de ultima.

Cum pot face awk recunoașteți dacă șirul conține doar un director și niciun nume de fișier și, în acest caz, tipăriți o coloană înainte de ultima.

Problema mea este că un director ar putea arăta ca:

./folder1/folder2/folder3/ 

și în acest caz ultima coloană ar fi goală. Vreau ca awk să recunoască acest lucru și apoi să imprime folder3 (deci cu o coloană înainte de ultima).

Răspuns

Puteți utiliza fie if, fie operatorul ?: pentru aceasta.

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

Comentarii

  • ternary operand test ? true : false este o alegere inteligentă.

Răspuns

Cu utilitarele GNU vezi și:

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

Care pe o intrare list.txt ca:

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

oferă:

folder3 foo bar / 

zsh „s :t modificator (din csh) dă "" pentru "/" în loc de "/"

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

Răspuns

încercați

(totuși nu am putut să-l testez).

Răspuns

În shell:

$ basename ./folder1/folder2/folder3/ folder3 

Atribuirea unei variabile, utilizând basename cu o variabilă care deține un calea:

filename=$( basename "$pathname" ) 

Utilitarul basename este un standard Utilitar POSIX .

Comentarii

  • thx, întrebarea mea a câștigat ceva mai mult în ceea ce privește utilizarea AWK, utilizarea basename este mult mai simplă.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *