É uma maneira elegante de selecionar linhas em um arquivo onde uma determinada coluna possui um determinado valor?

0

Eu tenho um arquivo com muitas linhas como esta

0       file:/home/knappen/somefilename.txt  7       0.2838356973995272      19      0.21823286052009455     18      0.10121158392434988     15      0.07816193853427897     11
  0.07284278959810875     6       0.056885342789598115    8       0.03738179669030733     22      0.032062647754137114    23      0.01610520094562648     12      0.01610520094562648     16      0.010786052009456266    0       0.010786052009456266    13      0.009013002364066195    5       0.009013002364066195    10      0.007239952718676124    9       0.007239952718676124    14      0.005466903073286052    4       0.005466903073286052    21      0.003693853427895981    20      0.003693853427895981    17      0.003693853427895981    3       0.003693853427895981    2       0.003693853427895981    1
   0.003693853427895981

e eu quero selecionar todas as linhas onde a entrada na terceira coluna é igual a um determinado número.

Eu sei escrever um padrão para grep -E para esse propósito ou escrever um pequeno script python ou perl com esse efeito, mas me pergunto se existe uma solução elegante usando o GNU coreutils.

P.S. Eu encontrei algumas respostas com boas sugestões nesta questão Selecionando linhas em um arquivo CSV com base no valor da coluna , mas as ferramentas estão além do núcleo do kernel GNU. As respostas são boas o suficiente para trabalhar para mim, mas para aprender mais sobre o poder dos utilitários de shell eu faço essa pergunta de qualquer forma.

    
por jknappen 12.11.2018 / 15:44

1 resposta

3

Awk é uma ferramenta bastante poderosa para formatação / manipulação de texto e correspondência de padrões. Ele limita cada linha do arquivo com um de-limitador personalizado, com o padrão sendo um único espaço em branco. Depois de dividir, os campos individuais podem ser acessados a partir de $1,$2..$N , onde N é o último número da coluna na linha.

Então, para sua exigência, basta combinar a terceira coluna com o valor que você precisa

awk '$3 == "string"' file 

Se o arquivo for um CSV que tenha um de-limitador diferente, por exemplo , apenas defina como

awk -v FS="," '$3 == "string"' file

Além disso, awk não é específico do GNU, sua variante deve estar disponível em máquinas * nix e também em conformidade com POSIX.

    
por 12.11.2018 / 15:57