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.