특정 열에 특정 값이있는 행을 grep하는 방법은 무엇입니까? 0.000 202.000

다음과 같은 파일이 있습니다

  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  

첫 번째 열에 소수점 .000 및 .500 만있는 행만 grep하고 싶습니다. 그래서 출력은 다음과 같습니다

  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  


답변

grep을 사용하지 않습니다. 사용하십시오 awk.

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

답변

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

첫 번째 열 $1/\.500|\.000/점 과 일치 하고 문자 ~는 부분적으로 일치 하는 정규 표현식이 아닌 리터럴 점으로 이스케이프됩니다.$0


답변

첫 번째 열에 소수점 .000 및 .500이있는 행만 grep하고 싶습니다.

내 첫 생각

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

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

이것을 표현하는 더 간결한 방법이 있습니다.

$ 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

첫 번째 열에 3 자리 정수 이외의 부분이있을 수있는 경우

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

경우에 따라 [:digit:]대신 사용해야 할 수도 있습니다 [0-9].

등등.

man grep 당신의 친구입니다.


답변

사용 사례에 따라 실제 숫자 연산을 사용할 수도 있습니다.

$ awk '{a = $1 % 1} a == 0 || a == 0.5' /tmp/foo
  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

BSD awk (OSX El Capitan, 20070501) 및 GNU awk 4.1.4로 테스트되었습니다.


답변

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

답변

awk:

$>awk '$1%.5==0' data.tsv
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

mlr:

$>mlr --ifs tab --onidx filter '$1%.5==0' data.tsv
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

답변

좋아, 조금 늦게 내 기여를 추가하지만 그만한 가치가 있다고 생각합니다.

영업 당 충족시킬 수있는 요구 사항의 진수 값 갖는 첫 번째 열입니다 .000또는 .500만. 범위 또는 길이를 기준으로 선행 값에 대한 규정이 없습니다. 견고성을 위해이 첫 번째 열의 이전에는 공백이 아닌 문자 (또는 더 이상 첫 번째 열이다)와이없는 것을 제외하고는 아무것도에 의해 제한되는 것으로 가정해서는 안된다 첫 번째 열의 내용이 있다는 것이다 소수점을 가지고 ., 어딘가에.

영업 이익은 사용하고자한다 grep할 수있는 유일한 것은 일치하는 패턴을 생성하므로, 일치가 발견되면 전체 라인을 출력합니다, 모든단지 무엇을 요구된다.

단순성 자체를 사용할 이유가 sed없거나 awk`grep ‘으로 소스를 파일이나 파이프로 처리 할 수 ​​있습니다.

grep파일 사용grep '^[^.]*\.[05]0\{2\}\s' the_file.txt

grep파이프 사용에서my_command | grep '^[^.]*\.[05]0\{2\}\s'

패턴은 다음 ^과 같습니다. , 줄의 시작 부분에서 시작합니다. [^.], 10 진수가 아닌 문자와 일치합니다. *가능한 한 여러 번 (없음 포함); \.소수점과 일치합니다. [05], 5 또는 0과 일치합니다. 0\{2\}, 2 개 더 0을 일치시킵니다 (개방형 및 폐쇄 형 괄호 앞의 백 슬래시는 쉘이 괄호 확장을 시도하지 못하도록합니다). \s, 공백 문자를 일치시킵니다 (열의 끝을 의미 함-다른 사용 사례에서 사용하려면 열 구분 기호 (일반적으로 쉼표, 세미콜론 또는 탭 \t)로 바꾸십시오 ).

이것은 OP가 요청한 것과 정확히 일치 합니다 . 그것은 것입니다 하지 일치 .5000또는 .0000정확히 다음에 5 제로의 패턴 외모 때문에 수치 적으로 동등한 비록 더 제로 공백 하였다. 그것이 중요하다면, 지금까지의 다른 모든 대답은 테스트 자리 이후 1보다 큰 0과 일치한다는 점에서 실패합니다. 그리고 FloHimself으로 대답을 제외하고, 그들은 일치 아무것도 두 번째 열에서 시작을 .000 하거나 .500, 포함 .0003하고 .500T, 그리고 FloHimself에 의해 하나는 수학적으로 동등하다 아무것도 일치 .0하고.50이 몇 개이든 상관 없습니다. 마지막은 OP가 언급 한 것과 일치하지 않지만 OP가 필요로하는 것과 일치 할 가능성이 있습니다.

마지막으로 awkOP가 요청했지만 전력 및 속도 가 필요한 grep경우 명령은 다음과 같습니다.

파일로 awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt

파이프로 my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'