Extrai o nome do arquivo do caminho no programa awk

19

Eu tenho um script awk e passei um arquivo CSV para ele.

awk -f script.awk /home/abc/imp/asgd.csv

O que estou fazendo é obter o FILENAME em script.awk . FILENAME me dá todo o caminho. Como estou no awk não consigo usar basename FILENAME .

print FILENAME;
/home/abc/imp/asgd.csv

Eu tentei com isso dentro de script.awk

echo $FILENAME | awk -F"/" '{print $NF}'

mas não consigo executar isso em script.awk . Como posso obter asgd.csv dentro de um programa awk?

    
por Aashu 03.06.2014 / 09:58

4 respostas

25

Várias opções:

awk '
  function basename(file) {
    sub(".*/", "", file)
    return file
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

Ou:

awk '
  function basename(file, a, n) {
    n = split(file, a, "/")
    return a[n]
  }
  {print FILENAME, basename(FILENAME)}' /path/to/file

Observe que essas implementações de basename devem funcionar para os casos comuns, mas não em casos de canto como basename /path/to/x/// , onde retornam a sequência vazia em vez de x ou / , onde retornam a sequência vazia em vez de / , embora para arquivos regulares, isso não aconteça.

O primeiro não funcionará corretamente se os caminhos de arquivo (até o último / ) contiverem sequências de bytes que não formam caracteres válidos no código de idioma atual (geralmente esse tipo de coisa acontece em locales UTF-8) com nomes de arquivos codificados em algum conjunto de caracteres de byte único de 8 bits). Você pode contornar isso fixando o código de idioma em C, onde cada sequência de caracteres válidos do formulário de byte.

    
por 03.06.2014 / 10:35
8

Tente este one-liner awk,

$ awk 'END{ var=FILENAME; split (var,a,/\//); print a[5]}' /home/abc/imp/asgd.csv
asgd.csv
    
por 03.06.2014 / 10:31
0

a melhor maneira de exportá-lo a partir do CSV de entrada ou diretamente do caminho do arquivo de entrada, você pode invertê-lo e, em seguida, obter uma coluna e depois invertê-la.

function getFileFromPath() {
    FileName=$1
    cat $FileName | while read Filename
    do
        echo $Filename| rev | awk -v FS='/' '{print $1}' | rev 
    done
}

ou simplesmente

echo $FileNamePath| rev | awk -v FS='/' '{print $1}' | rev 
    
por 08.01.2018 / 07:04
0

Use a função de divisão do Awk

Uma maneira de fazer isso é usar a função split. Por exemplo:

awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' /path/to/file

Isso funciona até mesmo em vários arquivos. Por exemplo:

$ awk '{idx = split(FILENAME, parts, "/"); print parts[idx]; nextfile}' \
      /etc/passwd /etc/group
passwd
group
    
por 20.11.2018 / 20:49

Tags