Extrai inteiros do arquivo e imprime para outro arquivo?

5

Eu tenho o seguinte arquivo foo.txt:

1
AbcdJ
8192
Pak78
8291

Eu gostaria de um script bash que extraia todas as linhas contendo somente inteiros (por exemplo, 1, 8192, mas não AbcdJ ou Pak78) e envia a saída para bar.txt.

    
por ubashu 16.07.2016 / 22:15

3 respostas

11

Isso extrai linhas que contêm apenas dígitos:

$ grep -E '^[[:digit:]]+$' foo.txt
1
8192
8291

Isso envia a saída para bar.txt :

grep -E '^[[:digit:]]+$' foo.txt >bar.txt

Como funciona

Quando você deseja selecionar linhas de um arquivo, grep é o primeiro utilitário a ser usado.

^[[:digit:]]+$ é uma expressão regular . Nela, ^ corresponde ao início de uma linha, [[:digit:]]+ corresponde a um ou mais dígitos e $ corresponde ao final de uma linha. Como essa regex começa com ^ e termina com $ , ela corresponde apenas a linhas inteiras. Uma maneira alternativa de combinar apenas linhas inteiras é usar a opção -x :

grep -xE '[[:digit:]]+' foo.txt >bar.txt

A opção -E indica grep para usar expressões regulares estendidas . Isso reduz a necessidade de escapar das coisas no regex.

O > significa redirecionamento . Isso faz com que a saída que apareceria na tela vá para um arquivo chamado bar.txt .

    
por John1024 16.07.2016 / 22:20
6

Solução AWK:

$> cat input.txt
1
AbcdJ
8192
Pak78
8291
3 blind mice
$> awk '/^[[:digit:]]+$/' input.txt
1
8192
8291

Use > para redirecionar a saída para o arquivo

awk '/^[[:digit:]]+$/' input.txt > output.txt
    
por Sergiy Kolodyazhnyy 17.07.2016 / 00:39
2

Algumas outras ferramentas:

  • sed :

    $ sed -n '/^[0-9]\+$/ p' foo.txt
    1
    8192
    8291
    
  • bash , mais lento que outras abordagens:

    $ while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt
    1
    8192
    8291
    

Para salvar a saída em outro arquivo, use o redirecionamento de saída, > :

sed -n '/^[0-9]\+$/ p' foo.txt >output.txt
while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt >output.txt
    
por heemayl 17.07.2016 / 10:51

Tags