copie todas as linhas de um arquivo de texto que contenha um número maior que 5000

0

Oi eu tentei muitas soluções para perguntas semelhantes e nenhuma pareceu funcionar para mim. Eu tenho um arquivo de texto em que cada linha tem um comprimento indefinido de números após a string "length_". Como posso selecionar todas as linhas em que esse número é igual ou maior que 5000? Essa foi a tentativa de código com a aparência mais limpa que tentei até agora, mas ainda produz apenas um arquivo vazio (mesmo que o arquivo1 definitivamente contenha linhas com números maiores que 5000)

grep --regexp="length_\"[5-9][0-9]\{3,\}\"" file1.txt > file2.txt

informações de exemplo no arquivo de texto de entrada:
/file/path/xx00:>TEXT_1_length_81903_cov_10.5145_
/file/path/xx01:>TEXT_2_length_348971_cov_13.6753_
/file/path/xx02:>TEXT_3_length_4989_cov_11.9516_
/file/path/xx03:>TEXT_4_length_29811_cov_13.7948_
/file/path/xx03:>TEXT_5_length_2567_cov_13.7948_

informações de exemplo desejadas no arquivo de texto de saída:
/file/path/xx00:>TEXT_1_length_81903_cov_10.5145_
/file/path/xx01:>TEXT_2_length_348971_cov_13.6753_
/file/path/xx03:>NODE_4_length_29811_cov_13.7948_

    
por Giles 12.07.2016 / 17:47

2 respostas

2

Aqui está uma maneira, usando o awk, para imprimir linhas de um arquivo que contém um número após a string "length_" que é menor ou igual a 5000:

awk '{sub("length_", "", $0); if ($0 <= 5000) { print "length_"$0 } }' input

Ele simplesmente diz a awk para remover a string "length_" e depois compara a parte restante da linha com 5000; se for menor ou igual a 5000, imprima "length_" e o restante da linha. A linha de assunto do seu Q diz (no momento) "maior que 5000", então se esse é o desejo real, simplesmente mude a comparação no awk:

awk '{sub("length_", "", $0); if ($0 > 5000) { print "length_"$0 } }' input

Dado o formato de arquivo atual , o comando awk pode ser simplificado consideravelmente:

awk -F_ '$4 > 5000' input

ou

awk -F_ '$4 <= 5000' input

dizendo ao awk para dividir os campos com base em sublinhados e comparando o quarto campo com 5000. Se a comparação for verdadeira, então (por padrão) imprima.

    
por 12.07.2016 / 18:15
1
grep -E '_length_([5-9][0-9]{3}|[0-9]{5,})_' file1.txt > file2.txt

exibe linhas contendo:

  • _length_ seguido por:
    • 5 - 9 e mais 3 dígitos (5000-9999) ou
    • 5 ou mais dígitos (10000 +)
  • seguido por _ .
por 13.07.2016 / 06:26