O que esse comando awk significa exatamente? [fechadas]

0

Você pode me explicar o significado deste comando:

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list'
    
por hicham aboulainain 12.02.2018 / 18:43

2 respostas

2

O comando

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list' somefilename

que é o mesmo que

awk 'BEGIN {while (getline < "list") array[$1]} $1 in array' somefilename

(no qual eu apenas renomei a variável list para array e removi um ; redundante) primeiro lê de um arquivo chamado list e então lê a partir de somefilename (ou entrada padrão, se somefilename não é fornecido) e apenas imprime as linhas desse arquivo cuja primeira coluna também existe na primeira coluna do arquivo list .

Escrito em "formato longo", o script awk pode ser escrito como

#!/usr/bin/awk -f

# This block runs before processing input data.
BEGIN {
    # Read "list" line by line.
    while (getline <"list")
        array[$1] = 1  # Make an entry in the associative array
                       # with the first column as key.
}

# This block processes data.
# If the first column of the data is a key in the array, print the whole line.
$1 in array { print } 

Em suma, é uma operação JOIN primitiva entre dois arquivos na primeira coluna de ambos os arquivos nos quais os arquivos não precisam ser classificados (preserva a ordem de classificação de somefilename ). O resultado será linhas de somefilename cuja primeira coluna corresponde a uma das primeiras colunas em list .

Outra maneira de fazer isso (quase) que não preserva a ordem seria

join <( sort list ) <( sort somefilename )

A ordenação do resultado seria diferente e todas as colunas de list seriam parte da saída (se alguém souber qual coluna seria desejada, isso pode ser corrigido usando o -o flag para join ). / p>

A alteração de $1 nos dois locais no script para $0 (a linha inteira, em vez de apenas a primeira coluna) tornará o script awk equivalente a

grep -Fx -f list somefilename

Aqui, o arquivo list é usado por grep como uma lista de padrões ( -f list ) que serão usados para fazer uma sequência fixa ( -F ), linha inteira ( -x ), comparações em %código%. Linhas correspondentes de somefilename serão impressas.

    
por 12.02.2018 / 20:21
1

A confusão provavelmente vem da sobrecarga do nome list . Talvez isso torne isso mais claro:

awk 'BEGIN { while( getline < "filename" ) myarray[$1] }'

Isso preencherá a matriz myarray com o primeiro campo de cada linha do arquivo filename .

Do manual do awk :

The 'function' [..] getline <file sets $0 to the next record from file.

    
por 12.02.2018 / 19:58

Tags