기본 10 파일의 이진수(0,1) 숫자에만 Grep 사용

기본 10 파일의 이진수(0,1) 숫자에만 Grep 사용

이진수(0,1)와 기타 10진수(0-9)를 포함하는 파일이 있다고 가정해 보겠습니다.

010... 10567
011... 23678
...

등.

위의 예는 실제로 이를 정확하게 표현한 것은 아니지만 그게 요점이 아닙니다. (단지 이 특정 사례를 설명하기 위한 것입니다.)

파일/출력에서 "숫자"를 찾는 방법을 이미 알고 있습니다.

grep '[0-9]*'

이것을 사용하십시오 :

grep '[0-1]*'

십진수의 일부인 1과 0이 강조 표시/선택됩니다.

그래서 같은 일을 어떻게 해야 할지 모르겠어요오직이진수(0,1). 따라서 예제 출력에는 이진수만 표시됩니다(이진수는 항상 동일한 열에 있음).

이를 수행할 수 있는 방법이 있습니까?

답변1

다음으로, 열의 데이터를 살펴보고 col열의 데이터에 1과 0만 포함될 때마다 인쇄하겠습니다.

col번호는 명령줄에 제공됩니다( 1여기에서는 해당 값을 사용함).

awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file

이진수가 항상 0으로 시작한다는 것을 알고 있다면 표현식을 에서 ^[01]+$( ^0[01]*$0 뒤에 임의의 수의 1 및/또는 0이 옴)로 변경할 수 있습니다. 만약 너라면또한이진수는 항상 세 자리 숫자라는 점을 알고 있으면 ^0[01][01]$또는 를 사용하세요 ^0[01]{2}$.

시험:

$ cat file
010 10567
011 23678
030 10567
012 23678
$ awk -v col=1 '$col ~ /^[01]+$/ { print $col }' file
010
011

답변2

더 간단한 해결책은 다음과 같습니다.

grep -E "\<[01]+\>" filename

\<\>는 단어 경계이며 정규식은 1회 이상 일치합니다 01.

awk를 사용하여 지정된 열만 일치시킬 수도 있습니다. awk를 사용하면 이진 문자열이 열 1에 있으면 다음을 수행할 수 있습니다.

awk 'match($1,/\<[01]+\>/) {print $1}'

답변3

더 나은 솔루션을 찾았을 때(댓글 섹션의 @Inian에 대한 크레딧)이전 게시물솔루션으로)

grep -E '\b[01]+\b'

이는 실제 바이너리 입력에만 작동하는 것 같습니다. 또한 십진수/기타 숫자의 일부인 이진수와 잘못 일치하지 않습니다.

그래서:

echo "10198865" |  grep -E '\b[01]+\b'

아무것도 출력되지 않지만 다음과 같습니다.

echo "101010" |  grep -E '\b[01]+\b'

하다.

답변4

0연속 적이고 1다른 숫자가 앞이나 뒤에 나오지 않는 숫자를 검색해야 하는 것 같습니다 . 따라서 다음과 같이 적어도 3번 연속 0으로 1(테스트되지 않음):

[^2-9][01]{3,}[^2-9]

편집: 댓글에서 언급했듯이 이는 "210001"과도 일치합니다.

관련 정보