Awk – imprime a última coluna ou a penúltima se a última for emty

Quero usar AWK para obter o nome do arquivo ou o nome da última pasta se a string for apenas um diretório.

Eu tenho:

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

para imprimir a última coluna e:

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

para imprimir uma coluna antes da última.

Como posso fazer awk reconhecer se a string contém apenas um diretório e nenhum nome de arquivo e, neste caso, imprimir uma coluna antes da última.

Meu problema é que um diretório pode ser semelhante a:

./folder1/folder2/folder3/ 

e, neste caso, a última coluna estaria vazia. Quero que awk reconheça isso e imprima folder3 (uma coluna antes da última).

Resposta

Você pode usar if ou o operador ?: para isso.

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

Comentários

  • operando ternário test ? true : false é uma escolha inteligente.

Resposta

Com os utilitários GNU, veja também:

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

Que em uma list.txt entrada como:

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

dá:

folder3 foo bar / 

zsh “s :t modificador (de csh) dá "" para "/" em vez de "/"

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

Resposta

experimente

(não fui capaz de testá-lo).

Resposta

No shell:

$ basename ./folder1/folder2/folder3/ folder3 

Atribuindo a uma variável, usando basename com uma variável que contém um nome do caminho:

filename=$( basename "$pathname" ) 

O utilitário basename é um padrão Utilitário POSIX .

Comentários

  • thx, minha pergunta tem ganhado muito com o uso de AWK, usar basename é muito mais simples.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *