다음과 같은 파일이 있습니다
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
하고.5
0이 몇 개이든 상관 없습니다. 마지막은 OP가 언급 한 것과 일치하지 않지만 OP가 필요로하는 것과 일치 할 가능성이 있습니다.
마지막으로 awk
OP가 요청했지만 전력 및 속도 가 필요한 grep
경우 명령은 다음과 같습니다.
파일로 awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt
파이프로 my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'