Como o awk -F funciona?

1

Por favor, você pode explicar como funciona a parte seguinte do código?

l_Basename="hello_world.ksh"

l_THIS_FILE='echo $l_Basename | awk -F. '{field=1
             while (field < NF) {
                 printf $field
                 if (field < NF - 1) {
                     printf "."}
                 field++} 
             printf "\n"}''
    
por Harsha 15.11.2014 / 09:10

2 respostas

2

-F. define o Separador de campos para . : Dada uma linha a.b.c. , o awk verá quatro campos: a , b , c e (um campo vazio).

field=1
while (field < NF) 
{
     printf $field
     if (field < NF - 1) 
     {
         printf "."
     }
     field++
}
  • O código faz um loop em cada campo e o imprime. Observe que field começa com 1, pois o campo 0 é a linha inteira (ou registro , para ser preciso). Como o cheque é < NF , nunca atinge o último campo.
  • Até o segundo último campo, ele adiciona um . , presumivelmente como um separador de campo para outro programa a ser manipulado.

Todos disseram que esse código é uma maneira complicada de implementar basename , um comando usado frequentemente para remover a extensão de um nome de arquivo :

$ basename hello_world.ksh .ksh
hello_world

Mesmo em awk , uma maneira mais concisa seria decrementar o número de campos em um: NF-- e definir o Separador do campo de saída como . , para que seja adicionado automaticamente entre os campos:

$ echo hello_world.ksh | awk -F. -v OFS=. '{NF--}1'
hello_world
    
por muru 15.11.2014 / 09:29
1

A opção "-F" permite alterar o caractere "separador de campos" do Awk. O awk considera cada linha de dados de entrada como composta de vários "campos", que são essencialmente palavras separadas por espaços em branco. Um espaço em branco (ou um caractere de tabulação) é o "separador de campo" padrão. Em alguns casos, os dados de entrada podem ser divididos por outro caractere, por exemplo, um ":", e seria bom poder dizer ao Awk para usar um separador de campo diferente. Isso é o que a opção "-F" faz. Para invocar Awk e especificar um ":" como o separador de campo, escrevemos:

awk -F: ...

Nesse caso, o separador de campo é um "."

    
por Rohith Madhavan 15.11.2014 / 09:27