Você está procurando a opção -v
para awk
:
-v var=val
--assign var=val
Assign the value val to the variable var, before execution of
the program begins. Such variable values are available to the
BEGIN rule of an AWK program.
Algo parecido com isto:
cat ID.txt |
while read line; do awk -vline="$line" '$1 == l' test.txt >"$line".txt;done
Qual seria melhor expressado como (evitando o uso inútil de gato):
while read line; do
awk -vline="$line" '$1 == l' test.txt >"$line".txt;
done < ID.txt
No entanto, isso é muito lento e ineficiente. Você está executando o comando awk
em todo o test.txt
para cada linha de ID.txt
. Por que não apenas ler ID.txt
em awk
e imprimir as linhas correspondentes:
awk 'NR==FNR{a[$1]++; next} ($1 in a){print >> $1".txt"}' ID.txt test.txt
O acima salva o primeiro campo de ID.txt
na matriz a
. NR
e FNR
são% especiaisawk
variáveis que significam "a linha atual do fluxo de entrada" e "a linha atual do arquivo atual". Os dois serão apenas iguais entre si quando o primeiro arquivo estiver sendo lido. Portanto, NR==FNR{a[$1]++; next}
será executado apenas nas linhas do primeiro arquivo. A segunda parte não será executada porque o next
informa awk
para pular para a próxima linha.
A segunda parte, verifica se o primeiro campo da linha atual (lembre-se, isso é executado somente no segundo arquivo) existe na matriz a
(o que significa que estava em ID.txt
) e, se existir, imprime a linha em um arquivo chamado "field1.txt"