Como fazer grep em linhas que possuem determinado valor em uma coluna específica?

Como fazer grep em linhas que possuem determinado valor em uma coluna específica?

Eu tenho um arquivo como o seguinte

  200.000    1.353    0.086
  200.250    1.417    0.000
  200.500    1.359    0.091
  200.750    1.423    0.000
  201.000    1.365    0.093
  201.250    1.427    0.000
  201.500    1.373    0.093
  201.750    1.432    0.000
  202.000    1.383    0.091
  202.250    1.435    0.000
  202.500    1.392    0.087
  202.750    1.436    0.000
  203.000    1.402    0.081
  203.250    1.437    0.001
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045  

Eu gostaria de fazer grep apenas nas linhas que possuem na primeira coluna os decimais .000 e .500 apenas para que a saída ficasse assim

  200.000    1.353    0.086
  200.500    1.359    0.091
  201.000    1.365    0.093
  201.500    1.373    0.093
  202.000    1.383    0.091
  202.500    1.392    0.087
  203.000    1.402    0.081
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045  

Responder1

Você não usa grep. Usar awk.

"your data" | awk '$1 ~ /\.[05]00/'

Responder2

awk '$1 ~ /\.[50]00/ { print $0 }' myFile.txt

A primeira coluna $1será comparada com /\.500|\.000/os pontos que escapam para serem pontos literais, não regex qualquer caractere ~, é uma correspondência parcial e imprime a linha inteira$0

Responder3

Eu gostaria degrepapenas as linhas que possuem na primeira coluna os decimais .000 e .500

Meu primeiro pensamento

grep '^ *[0-9][0-9][0-9]\.[50]00' filename

Teste rápido usando WSL

$ head testdata
              200.000    1.353    0.086
              200.250    1.417    0.000
              200.500    1.359    0.091
              200.750    1.423    0.000
              201.000    1.365    0.093
              201.250    1.427    0.000
              201.500    1.373    0.093
              201.750    1.432    0.000
              202.000    1.383    0.091
              202.250    1.435    0.000
$ grep '^ *[0-9][0-9][0-9]\.[50]00' testdata
              200.000    1.353    0.086
              200.500    1.359    0.091
              201.000    1.365    0.093
              201.500    1.373    0.093
              202.000    1.383    0.091
              202.500    1.392    0.087
              203.000    1.402    0.081
              203.500    1.412    0.073
              204.000    1.423    0.065
              204.500    1.432    0.055
              205.000    1.441    0.045

Existem maneiras mais concisas de expressar isso.

$ grep -E '^ *[0-9]{3}\.[50]00' testdata
              200.000    1.353    0.086
              200.500    1.359    0.091
              201.000    1.365    0.093
              201.500    1.373    0.093
              202.000    1.383    0.091
              202.500    1.392    0.087
              203.000    1.402    0.081
              203.500    1.412    0.073
              204.000    1.423    0.065
              204.500    1.432    0.055
              205.000    1.441    0.045

Se a primeira coluna puder ter outra parte inteira que não seja de 3 dígitos

grep -E '^ *[0-9]+\.[05]00' testdata

Em algumas circunstâncias, pode ser necessário usar [:digit:]no lugar de [0-9].

E assim por diante.

man grepé seu amigo.

Responder4

 grep -e '2[^ ]*.000' -e '2[^ ]*.500' file.txt

informação relacionada