Apagar várias linhas de um arquivo usando grep

4

Eu tenho um arquivo com várias linhas que se parece com isso:

marca, modelo, polegadas, preço

dell       xps      13    9000     
macbook    pro      13    13000
asus       zenbook  13    10500

Eu quero apagar as linhas onde o preço é maior que 10000. Eu quero perguntar se é possível usar grep?

    
por dimitrisd 16.09.2015 / 16:19

4 respostas

5

Você pode usar o seguinte para obter as linhas cujo preço é maior que 10000:

$ grep -E '.* [0]*[1-9][0-9]{4,}$' file.txt 
macbook    pro      13    13000
asus       zenbook  13    10500

Se você quiser remover essas linhas, adicione -v :

$ grep -vE '.* [0]*[1-9][0-9]{4,}$' file.txt 
dell       xps      13    9000     
  • .* corresponderá a todos os caracteres até a última coluna que contiver os preços

  • [1-9] corresponderá ao primeiro dígito do preço

  • [0-9]{4,}$ corresponderá a 4 ou mais dígitos após o primeiro dígito, portanto, temos um total de cinco dígitos que significam 10000 ou mais

por 16.09.2015 / 16:24
4

É possível, mas grep usa expressões regulares que operam em strings, não em números.

grep -v '[0-9]\{5\}$' input.txt

-v remove as linhas correspondentes. [0-9] corresponde a qualquer dígito, \{n\} significa que a anterior é repetida n vezes (5 vezes neste caso, ou seja, 10000 e mais). $ corresponde ao final da linha.

awk pode comparar números, por isso é mais adequado para o trabalho:

awk '$4<10000{print}' input.txt

ou Perl:

perl -ane 'print if $F[-1] < 10000' input.txt
    
por 16.09.2015 / 16:26
2

Dada sua entrada de amostra:

$ cat /tmp/foo
dell       xps      13    9000
macbook    pro      13    13000
asus       zenbook  13    10500

Você pode usar o awk:

$ awk '{ if ($4 <= 10000) print; }' /tmp/foo
dell       xps      13    9000
    
por 16.09.2015 / 16:26
2

tente

cp input.txt original.txt
awk 'NR==1 || $4 < 10000 ' original.txt > input.txt

onde

  • condição com NR == 1 para manter a linha de cabeçalho.
por 16.09.2015 / 16:30