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 (<>) { ... }
-E
Perl은 (해당 루프 내에서) 명령줄을 실행해야 합니다. 활용 가능성도 높아진다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 버전에 대한 추가 정보