첫 번째 열과 일치하는 문자열을 찾으려면 어떻게 해야 합니까?

첫 번째 열과 일치하는 문자열을 찾으려면 어떻게 해야 합니까?

match_E2일치하는 문자열( sum pattern_2)과 첫 번째 열만 가져오려고 합니다 .

abcd.corp;;a123,Virtual,aws,Linux,Linux,match_E2,Database
web1.corp;;,Virtual,azure,match_E2,Linux,corpo,Database
web2.corp;;match_E2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_2,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database

예상 출력은 다음보다 낮을 수 있습니다.

abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2

-o옵션을 사용해 보았지만 grep일치하는 문자열만 제공합니다.

답변1

감히 말씀드리자면 귀하의 사건은 더 잘 처리될 수 있을 것입니다 sed.

패턴 의 경우 match_E2:

$ sed -nE 's/^([^;]+).*(match_E2).*/\1,\2/p' file.txt

패턴 의 경우 pattern_2:

$ sed -nE 's/^([^;]+).*(pattern_2).*/\1,\2/p' file.txt

두 가지 모드를 동시에 사용하려면:

$ sed -nE 's/^([^;]+).*(match_E2|pattern_2).*/\1,\2/p' file.txt

즉, 기본적으로 다음과 같습니다.

$ sed -nE 's/^([^;]+).*(    ).*/\1,\2/p' file.txt
#                       ^  ^
#                       |  |
#            ---------------------
# put within these two parentheses the same (Extended Regular Expression) pattern you would use with `grep -E`

;첫 번째 필드와 나머지 행 사이의 구분 기호 중 하나 이상에만 의존한다는 점에 유의하세요 .

답변2

다음 awk명령은 원하는 작업을 수행해야 합니다.

awk -F'[;,]' -v pat="match_E2" '$0~pat{for (i=3;i<NF;i++) {if ($i ~ pat) printf("%s,%s\n",$1,$i)}}' file.txt
  • 이 옵션은 및를 필드 구분 기호 로 인식 하고 이에 따라 행을 분할하도록 -F'[;,]'지시합니다 .awk;,POSIX 표준에서는 이러한 다중 문자 필드 구분 기호를 완전한 정규식으로 해석하도록 요구하지만 awk이 기능을 올바르게 구현하지 않는 버전이 있을 수 있습니다.

  • 모드는 -v pat="match_E2"명령줄 옵션을 통해 모드를 통해 awk로 전달됩니다.이렇게 하면 패턴이 완전한 정규식으로 해석됩니다. 이 문맥에서 그 안에 있는 문자가 특별한 의미를 갖고 있다면 이스케이프 처리해야 합니다!

  • 현재 줄이 패턴과 일치하면( "전체 줄이 $0 ~ pat어딘가에 저장된 pat정규식과 일치하는 경우"를 의미) 모든 관련 필드(필드 3은 마지막 필드 다음의 첫 번째 필드 ;)를 반복하고 실제 일치하는 필드(조건 if ($i ~ pat))를 식별합니다. 그런 다음 첫 번째 필드( $1)와 일치하는 필드( )를 인쇄하여 이를 수행합니다 $iprintf().이는 일치하는 행에 해당 필드가 하나만 있을 수 있다고 가정합니다.!

여러 패턴을 찾고 있다면 pat다음과 같이 그에 따라 정규식을 공식화 할 수 있습니다.

awk -F'[;,]' -v pat="match_E2|pattern_2" ' ... etc ... '

또는 각 모드에 대해 한 번씩, 명령을 두 번 실행하십시오.

답변3

grep -o다음 기능을 사용하는 awk 버전과 비슷 합니다 match.

$ awk -F';' 'match($0,/match_E2|pattern_2/) {print $1 "," substr($0,RSTART,RLENGTH)}' file
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2

답변4

이는 전체 리터럴 문자열 일치를 수행하므로 대상 문자열에 정규식 메타 문자가 포함되어 있거나 입력에서 하위 문자열로 나타나는 경우에도 작동합니다.

$ awk '
    BEGIN { strs["match_E2"]; strs["pattern_2"]; FS=";"; OFS="," }
    { for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
abcd.corp,match_E2
web1.corp,match_E2
web2.corp,match_E2
web3.corp,pattern_2
web4.corp,pattern_2

부분 일치와 완전 일치의 예를 보려면 다음 입력을 고려하세요.

$ cat file
abcd.corp;;a123,Virtual,aws,Linux,Linux,mismatch_E2,Database
web1.corp;;,Virtual,azure,match_E2,Linux,corpo,Database
web2.corp;;match_E2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_275,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database

이제 입력의 첫 번째 줄에는 mismatch_E2and 가 포함 match_E2되고 네 번째 줄에는 pattern_275and and not 이 포함됩니다 pattern_2. 이제 위의 awk 스크립트를 실행하고 예상한 출력이 생성되는지 확인하세요.

$ awk '
    BEGIN { strs["match_E2"]; strs["pattern_2"]; FS=";"; OFS="," }
    { for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
web1.corp,match_E2
web2.corp,match_E2
web4.corp,pattern_2

정규식과 문자열 일치의 예를 보려면 match_E2입력의 1행을 다음으로 변경 m.*2하고 patch_24행을 다음으로 변경합니다.p.*2

$ cat file
abcd.corp;;a123,Virtual,aws,Linux,Linux,m.*2,Database
web1.corp;;,Virtual,azure,m.*2,Linux,corpo,Database
web2.corp;;m.*2,Virtual,a2responsible,Linux_Suse,Linux,corpo,Database
web3.corp;;Virtual,Virtual,corpo,pattern_2,Linux,corpo,Database
web4.corp;;Virtual,Virtual,corpo,,Linux,pattern_2,Database

위의 awk 스크립트를 수정하여 m.*2and 대신 p.*2에 예상한 출력이 생성되는 것을 다시 확인했습니다.match_E2pattern_2

$ awk '
    BEGIN { strs["m.*2"]; strs["p.*2"]; FS=";"; OFS="," }
    { for (str in strs) if (index(","$NF",",","str",")) print $1, str }
' file
abcd.corp,m.*2
web3.corp,p.*2

관련 정보