grep 명령을 사용하여 숫자 추출

grep 명령을 사용하여 숫자 추출

다음 파일 예제가 있습니다.

some text is here  
   sometext(1,21);
   sometext(2,9);
   sometext(3,231);
   sometext(10,1112);
   sometext(11,17)
Some text is here

괄호 안에 두 번째 숫자가 포함된 행을 추출하려고 하므로 sometext위의 예에서는 숫자가 21, 9, 231, 1112, 입니다 17.

grep위의 패턴에 맞는 명령을 찾지 못했습니다 .

답변1

GNU를 사용하는 경우 grepRE를 사용하여 쉼표 뒤의 숫자를 일치시킬 수 있습니다.

grep -oP ',\K\d+' file

네이티브에 perl해당하는 내용은 다음과 같습니다.

perl -lne 'print for /,\K\d+/g' file

답변2

grep유틸리티는 적어도 표준 Unix 도구를 사용하려는 경우 행의 일부를 추출하는 데 적합하지 않습니다. 표준 grep유틸리티는 패턴과 일치하는 전체 라인을 필터링하지만 부분 라인을 추출하는 자연스러운 방법은 없습니다. 보다 자세한 방법으로 선을 조작하려면 예를 들어 를 사용할 수 있습니다 sed.

텍스트가 표시된 것보다 더 길고 다양하다고 가정하면 텍스트 문자열을 통해 sometext(두 번째 정수 값으로 행을 처리할 시기를 알려줄 수 있습니다. 데이터에서 해당 문자열을 확인하면 두 번째 정수 앞과 뒤의 측면 비트를 잘라낼 수 있습니다.

여기서는 두 개의 트림 대체를 적용합니다. 하나는 줄의 시작부터 줄의 마지막 쉼표까지, 다른 하나는 닫는 괄호부터 줄의 끝까지 적용합니다. 각 줄의 기본 인쇄를 끄고 -n두 번째 대체 후에 결과 문자열을 명시적으로 인쇄합니다.

sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file

또한 특수 트리거 문자열과 일치하지 않는 행을 삭제하고 나머지 행에 두 대체 항목을 모두 적용할 수 있는 옵션도 있습니다.

sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file

결과 목록을 쉼표로 구분된 목록(질문에 표시된 것처럼)으로 원하는 경우 위 명령의 결과를 파이핑하는 것을 고려하십시오.

paste -d, -s -

귀하의 질문에 대한 데이터를 바탕으로 우리는 다음을 얻습니다.

$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17

답변3

이를 위해 필드 구분 기호로 awk쉼표나 닫는 괄호( )를 사용합니다 . 그러면 -F'[,)]'필드 2( ) $2에 원하는 숫자가 생성 됩니다. 이것을 $2에 숫자만 포함되어 있는 수표와 결합합니다.

$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt 
21
9
231
1112
17

이는 $2에 음수가 아닌 정수만 포함되어 있다고 가정합니다. 음수 및/또는 실수가 포함될 수 있는 경우 대신 다음을 사용하십시오.

awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt

참고: awk는 쉼표를 필드 구분 기호로 사용하기 때문에 쉼표를 소수 구분 기호로 사용하는 로케일에서는 작동하지 않습니다.

답변4

무거운 작업을 수행하는 데 사용할 수 있으며 쉼표를 원하지 않는다고 가정하여 grep정리에 사용할 수 있습니다 . tr또한 게시물에서 출력을 어떻게 렌더링할지 명확하지 않아 줄 바꿈으로 구분된 숫자 목록이 생성됩니다.

grep -Eo ",[[:digit:]]+" input.txt | tr -d ","

또는 유일한 솔루션 tr으로 사용하지 마십시오.grep

grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"

관련 정보