Como imprimir as linhas 15 e 25 de cada 50 linhas?

8

Eu tenho um arquivo grande e gostaria de imprimir de cada linha de 50 linhas, as linhas 15th e 25th .

sed -n '15,25p' inputfile

Como modificar este comando para imprimir somente as linhas 15 e 25 e fazer um loop em cada uma das 50 linhas no arquivo.

    
por Mohsen El-Tahawy 25.11.2016 / 11:57

4 respostas

20

awk 'NR % 50 == 15 || NR % 50 == 25'

seria a maneira óbvia de portabilidade.

Observe uma alternativa de sed do GNU:

sed '15~50b;25~50b;d'

Com qualquer sed , você sempre pode fazer:

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(chegar na próxima linha 14 vezes, imprimir, próxima linha 10 vezes, imprimir, próxima linha 25 vezes, voltar ao próximo ciclo (que pega a linha extra faltando para fazer 50)).

    
por 25.11.2016 / 12:43
9

este é um trabalho para awk

awk '(NR%50==15) || (NR%50==25)' inputfile

edit: eu fui induzido em erro pela instrução sed no OP.

    
por 25.11.2016 / 12:01
8

com perl

1) Semelhante à solução awk , a variável $. armazena o número da linha

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) Verifique a lista de números de linha, mais fácil de estender

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132
    
por 25.11.2016 / 13:47
3

Outra abordagem usando o awk, com base na idéia de Sundeep de usar uma lista:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

Defina as chaves na matriz a com base nas linhas que você deseja imprimir. Imprimir linhas em que NR % 50 corresponde a uma das chaves na matriz.

Para dar uma indicação do desempenho, cronometrei essa abordagem e a comparei com as outras respostas, tirando uma média do tempo user para três execuções.

0,276s

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374s

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0,384s

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0,542s

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
    
por 26.11.2016 / 18:08