이진수(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"과도 일치합니다.