여러 행에서 공통 숫자를 추출하는 방법은 무엇입니까?

여러 행에서 공통 숫자를 추출하는 방법은 무엇입니까?
http://abc/blah/hhh/25927/3456/bb
http://vfg/blahgg/hhvvh/kkk/25927/2378/bb/mm
http://lah/hhh/25927/fff/bb/somthin

위의 줄에서 공통 숫자는 다음과 같습니다.25927항상 그런 일이 일어난다/25927/모든 라인에 존재합니다. 그런데 숫자는 제가 미리 알 수 없는 변수라서 대신 쓸 수는 없고 grep 25927이렇게 해야 합니다.grep /commonnumber present in all lines/ file

답변1

perl -nE '%a = map { $.==1 || $a{$_} ? ($_,1):()} /(\d+)/g; 
          END{ say keys %a}'   file

설명하다:

  • -n프로그램 전체에 루프가 추가됩니다. 예를 들면 다음과 같습니다.

    while (<>) { ... }
    
  • -EPerl은 (해당 루프 내에서) 명령줄을 실행해야 합니다. 활용 가능성도 높아진다say

  • /(\d+)/g각 행은 각 숫자(서로 옆에 있는 숫자)와 일치하는 행 에 개별적으로 전달됩니다 . 에 입력하면 각 숫자가 map.

  • %a지금까지 모든 행에 나타나는 숫자 사전입니다. 각 행( )이 다시 계산됩니다 %a = ....

  • 첫 번째 줄에서는 $. == 1모든 숫자가 사전에 저장됩니다. (숫자, 1) 쌍을 추가하면 1은 true를 나타냅니다.

  • ()다른 행에서는 마지막 반복에도 나타나지 않는 한 모든 숫자가 필터링됩니다 $a{$_} ?.

  • 마지막 END{...}인쇄모든 행에서 모든 숫자가 반복됨.

답변2

$ awk -F/ 'NR==1{for(i=1;i<=NF;i++){Arr[$i]++}next}{for(j=1;j<=NF;j++){if ($j in Arr){Arr[$j]++}}}END{for (k in Arr){if(NR==Arr[k]&&k+0!=0){print k,Arr[k]}}}' input.txt

구분 기호 /를 사용하여 첫 번째 행을 추출하고 배열에 저장합니다. 두 번째 줄부터 해당 필드가 배열에 있는지 확인하세요. 배열에 존재하는 경우 값을 증가시킵니다. 마지막으로 행 번호와 비교하여 값을 확인하고 해당 번호를 결정합니다.

답변3

위의 경로와 같이 항상 슬래시 문자로 구분된 5자리 줄인 경우 다음과 같이 시도해 볼 수 있습니다.

egrep [/][0-9]{5}[/]문서

GNU 버전의 grep이 아닌 다른 버전을 사용하는 경우 egrep을 사용하면 확장된 정규식 구문을 사용할 수 있습니다. 보다매뉴얼 페이지grep 버전에 대한 추가 정보

관련 정보