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]) .