다른 파일에서 두 개 이상의 패턴을 일치시킵니다.

다른 파일에서 두 개 이상의 패턴을 일치시킵니다.

일치하는 기본 코드에 대한 문자열 검색

cat fileA | grep -Fwf include.txt

include.list에서 최소한 두 개의 패턴을 일치시키기 위해 코드를 어떻게 사용할 수 있습니까?

file A 
data1 khc001 khc002 vp005
data1 fbc001 cs004 khc001

include.txt
khc001
khc002

올바른 출력 라인 1:data1 khc001 khc002 vp005

아래 예에서는 2개의 패턴만 나열되어 있지만 목록에는 더 많은 패턴이 포함되어 있어 awk '/pattern1/ && /pattern2/'부적절합니다.

답변1

awk파일의 문자열과 동일한 각 줄의 필드 수를 계산하면 이 작업을 수행하는 것이 매우 쉽습니다 .fileAinclude.txt

awk 'NR == FNR { p[$1]; next }
     {
         c = 0
         for (i = 1; i <= NF; ++i) if ($i in p) c++
         if ( c >= 2 ) print
     }' include.txt fileA

먼저 include.txt파일을 읽고 단어를 연관 배열의 키로 사용하십시오. 그런 다음 두 번째 파일을 읽고 각 행에 대해 필드를 반복하고 각 필드를 테스트하여 키와 일치하는지 확인합니다.

일치할 때마다 카운터를 증가시키고, 카운터가 2 이상이면 해당 줄을 인쇄합니다.


"단조로움"을 좋아하는 분들을 위해 코드를 표현하는 또 다른 방법은 다음과 같습니다.

awk 'NR==FNR {p[$1];next} {c=0;for (i=1;i<=NF;++i) if ($i in p) c++} c>=2' include.txt fileA

답변2

패턴이 입력 파일과 동일한 순서이지만 잘못된 순서는 아니라고 가정하면 다음과 같이 작동합니다.

grep -F " $(tr '\n' ' ' <patterns)" infile

답변3

다음 grepception을 사용하여 이 작업을 수행할 수 있습니다.

grep -Fwf <(grep -v $(grep -oFwf include.txt fileA | head -1) include.txt) fileA

그러면 일치하는 패턴 중 하나가 제거되고 include.txt다른 일치 항목이 하나 이상 존재하게 됩니다.

답변4

grep -Fwonf include.txt file_A | 
uniq | 
cut -d: -f1 | 
printf '%dp\n' $(uniq -d) | 
ed -s file_A 

시험

파일 내용(file_A 테스트가 더 복잡함):

$ tail -n +1 -- file_A include.txt 
==> file_A <==
data1 khc001 khc002 vp005
data1 fbc001 cs004 khc001
data1 khc001 khc001 vp005
data1 khc002 khc001 vp005

==> include.txt <==
khc001
khc002

산출

data1 khc001 khc002 vp005
data1 khc002 khc001 vp005

관련 정보