Esta é uma maneira fácil e direta de conseguir o que você deseja. O problema aqui é que todo o large_file.txt
será verificado. Se isso for muito lento, há outras coisas para tentar. Uma delas seria carregar o arquivo em um banco de dados digitado nos números de linha, o que daria uma recuperação extremamente rápida em comparação com a varredura do arquivo.
#!/bin/sh
awk '
NR == FNR {
for (i=1; i<=NF; i++) {
linenums[$i]
}
}
NR != FNR {
if (FNR in linenums) {
print
}
}
' line_numbers.txt large_file.txt
NR
é o número do registro atual (Número de registros) e FNR
é o número do registro atual no arquivo atual.
Então, quando NR == NFR
awk está processando o primeiro arquivo arg, quando NR != NFR
awk
está processando o segundo arquivo (ou posterior).
Isso lê todos os números de linha de line_numbers.txt
e os armazena como chaves em uma matriz sem elementos de dados, somente chaves (a matriz linenums
).
Quando o segundo arquivo, large_file.txt
, estiver sendo lido, se o número do registro atual tiver sido armazenado como uma chave na matriz linenums
, a linha de large_file.txt
será impressa.
O método de procurar os números de linha na matriz linenums
é relativamente rápido porque awk
usa um algoritmo de hash interno para procurar as chaves.