Imprimindo todas as enésimas linhas de um arquivo grande em um novo arquivo [duplicado]

3

Estou tentando imprimir cada enésima linha de um arquivo com mais de 300.000 registros em um novo arquivo. Isso tem que acontecer a cada enésimo registro até chegar ao final do arquivo.

    
por Terisa 04.06.2017 / 20:44

4 respostas

9

awk 'NR % 5 == 0' input > output

Isto imprime a cada quinta linha.

Para usar uma variável de ambiente:

NUM=5
awk -v NUM=$NUM 'NR % NUM == 0' input > output
    
por 04.06.2017 / 22:57
2
sed -n -e '5{p;q}' yourfile > newfile

Onde N = 5, como um exemplo para o seu caso.

O comando sed é dividido como: -n significa "não imprime linhas por padrão"; então, na linha 5, execute um conjunto { ... } de comandos; esses comandos são: p rint a linha, então q uit.

    
por 04.06.2017 / 21:13
1

Similarmente ao sed, também temos o awk:

$ seq 1000000000 |awk 'NR==500000{print;exit}'
500000

NR = Número da linha que você deseja imprimir (e depois sair para evitar a espera do arquivo para terminar). No seu caso

awk 'NR==Nth{print;exit}' inputfile >outputfile

Onde Nth é o número da linha Nth que você precisa imprimir.

    
por 04.06.2017 / 21:53
1

Para imprimir todas as linhas N th, use

sed -n '0~Np'
Por exemplo, para copiar cada quinta linha de oldfile para newfile , do
sed -n '0~5p' oldfile > newfile

Isso usa o primeiro formulário de endereço do sed primeiro ~ passo , o que significa "corresponder a cada etapa ", começando a linha com a linha primeiro . Em teoria, isso imprimiria as linhas 0, 5, 10, 15, 20, 25,…, até o final do arquivo. Claro que não há line0, então apenas imprime lines5, 10, 20, 25,…; 0~5 é apenas uma maneira alternativa conveniente de dizer 5~5 (que imprime a cada 5 linhas começando com line5; isto é, linhas 5, 10, 15, 20, 25,…).

Para outro exemplo dessa capacidade sed (que não responde à pergunta),

sed -n '2~5p' oldfile

imprime as linhas 2, 7, 12, 17, 22, 27,… até o final do arquivo.

    
por 05.06.2017 / 03:24