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.