Como obter n linhas para cada m linhas (nm) na linha de comando?

7

Existe uma maneira muito simples (talvez usando uma linha com sed?) para obter n linhas, começando na linha ath dentro deste pedaço de n linhas, para cada m linhas?

Mais especificamente, tenho um arquivo com milhões de linhas. Para cada 4 linhas, quero pegar as duas primeiras linhas.

Mas acho que também quero ter uma ideia de fazer isso em outras situações semelhantes. É por isso que fiz uma pergunta mais geral aqui.

    
por coffee 12.02.2017 / 17:20

4 respostas

12

com gnu split :

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile

e se você quiser fazer isso somente após a linha i th, basta redirecionar as linhas anteriores para /dev/null :

n=2
m=4 
i=7
{ head -n ${i} >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile

Se você não tiver acesso às ferramentas gnu , poderá usar awk :

awk -vn=2 -vm=4 -vi=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile
    
por 12.02.2017 / 17:33
15

Você pode usar o ~ no endereço no GNU sed:

sed -n '1~4p;2~4p'

O que diz "Imprima a primeira linha a cada 4 linhas e imprima a segunda linha a cada 4 linhas" ou "A partir da linha 1, imprima a cada quarta linha e a partir da linha 2, imprima a cada quarta linha". >     

por 12.02.2017 / 17:33
5

Para o GNU sed

sed '3~4,+1 d' file

ou mais geral:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file
    
por 12.02.2017 / 17:48
4

Ou isso, gnu sed :

sed -n -e '1~4 {N; p;}' file

-n reprime a saída. Se na linha 1+4*k (k = iterador) a linha atual e a próxima linha forem lidas em pattern space e p imprime o espaço de padrão (atual) (isto é, permitindo temporariamente a saída)

    
por 12.02.2017 / 17:35