Pergunta

Usando sed ou similar como você extrair linhas de um arquivo? Se eu quisesse linhas 1, 5, 1010, 20503 de um arquivo, como é que eu recebo essas 4 linhas?

E se eu tiver um número bastante grande de linhas Eu preciso extrair? Se eu tivesse um arquivo com 100 linhas, cada uma representando um número de linha que eu queria extrair de outro arquivo, como eu faria isso?

Foi útil?

Solução

Algo como "sed -n '1p; 5p; 1010P; 20503p'. Execute o comando "homem sed" para obter detalhes

.

Para sua segunda pergunta, eu transformar o arquivo de entrada em um monte de (1) comandos sed para imprimir as linhas que eu queria.

Outras dicas

com awk é tão simples como:

awk 'NR==1 || NR==5 || NR==1010' "file"

@OP, você pode fazer isso mais fácil e mais eficiente com awk. Portanto, para sua primeira pergunta

awk 'NR~/^(1|2|5|1010)$/{print}' file

para segunda questão

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file

Eu investigar Perl, uma vez que tem as instalações de expressões regulares de sed mais o modelo de programação em torno dele para que você possa ler um arquivo linha por linha, contar as linhas e extrair de acordo com o que você quer (incluindo a partir de um arquivo de números de linha).

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

Isto não é muito e poderia exceder os limites de comprimento do comando em algumas circunstâncias * :

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

Ou o seu muito mais lento, mas mais atraente, e possivelmente mais bem-comportado, irmão:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

Uma variação:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

Você pode acelerar as versões xarg um pouco, adicionando a opção -P com algum grande argumento como, digamos, 83 ou talvez 419 ou mesmo 1177, mas 10 parece tão bom quanto qualquer outro.

* xargs --show-limits </dev/null pode ser instrutivo

Em Perl:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top