O problema vem de uma variável que recebe um valor que parece um sinalizador de linha de comando, como Satō Katsura apontou .
No entanto, o que você está fazendo também pode ser feito com
awk 'NR==FNR {p[++i]=$0;next} {for (i in p){if (match($0,p[i])){c[i]++}}} END {for (i in p){print p[i],c[i]}}' uniq.txt stage.txt >output.txt
... se o número de padrões em uniq.txt
não estiver na casa dos milhões.
O script awk
foi desvendado:
NR==FNR { p[++i] = $0; next }
{
for (i in p) {
if (match($0, p[i])) {
c[i]++
}
}
}
END {
for (i in p) {
print p[i],c[i]
}
}
Primeiro, lê cada linha de uniq.txt
na matriz p
e continua contando (na matriz c
) quantas linhas de entrada do segundo arquivo contém cada padrão em p
.
No final, os padrões e as contagens correspondentes são exibidos.
Isso evita um loop de shell lento (executando grep
e wc
uma vez para cada padrão e também abrindo e gravando em um arquivo de saída muitas vezes) e também evita ter que lidar com padrões de leitura em uma variável shell com read
.
Se você deseja fazer uma correspondência de cadeia fixa, ou seja, não tratar as linhas em uniq.txt
como padrões de expressão regular, mas como sequências fixas (como em grep -F
), basta alterar a chamada de função match($0, p[i])
para index($0, p[i])
.