두 개의 파일을 Grep하고 여러 히트가 있는 줄을 인쇄합니다.

두 개의 파일을 Grep하고 여러 히트가 있는 줄을 인쇄합니다.

두 개의 파일이 있습니다.

  • file1.txt
    abc
    def
    ghi
    jkl
    mno
    pqr
    
  • file2.txt
    abc ghi
    abc xyz
    xyz xyz
    mno jkl
    def stu
    

(열 구분 기호는 탭입니다)

나는 file1.txt다음과 같이 grep하려고합니다.file2.txt

grep -w -f file1.txt file2.txt

다음과 같은 결과가 나타납니다.

abc     ghi
abc     xyz
mno     jkl
def     stu

그러나 내가 원하는 것은 출력입니다둘 다아래와 같이 열 1과 열 2 file2.txt에 조회가 있습니다 .file1.txt

abc     ghi
mno     jkl

어떤 도움이라도 환영합니다.

감사해요.

답변1

각 값을 file1.txt배열에 저장합니다 a. 그런 다음 file2.txt첫 번째 필드와 두 번째 필드가 모두 포함된 행을 구문 분석하고 인쇄합니다 a.

awk 'NR==FNR{a[$0];next}$1 in a && $2 in a' file1.txt file2.txt

의 필드 수에 관계없이 file2.txt모든 필드를 반복하고 검사를 수행합니다. 필드 중 하나가 에 없으면 a다음 줄을 계속 진행하고, 그렇지 않으면 해당 줄을 인쇄합니다.

awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(!($i in a)){next}}print}' file1.txt file2.txt

답변2

pbm을 사용하면 요소를 포함하는 python상위 집합을 생성하여 pbm에 접근 할 수 있습니다.bfile1.txt

그런 다음 읽은 각 행에 대해 file2.txt현재 행에서 형성된 집합이 상위 집합 b의 하위 집합인지 확인합니다. 이 경우 file2.txt의 현재 줄을 인쇄합니다.

$ python3 -c 'import sys
f1, f2 = sys.argv[1:]
with open(f1) as fh1, open(f2) as fh2:
  b = set([l.strip() for l in fh1])
  print(*(l.rstrip() for l in fh2 if set(l.strip().split()).issubset(b)), sep="\n")
' file1.txt file2.txt

abc ghi
mno jkl
$ perl -lane '$. == 1 and 
    %h = map { /(.*)(\n)/ } <STDIN>;
    print if ! grep { ! $h{$_} } @F;
' file2.txt < file1.txt

sed를 사용하여 file1.txt를 예약된 공간에 저장한 다음 File2.txt에서 읽은 각 줄에 대해 현재 줄의 모든 요소의 존재 여부를 비교하고 모든 요소가 발견되면 인쇄합니다.

$ sed -Ee '
    /\n/{h;d;}
    /\s/!{H;d;}
    G;h
    s/\n.*//;s/\n//;x
    :a
      s/^\s?(\S+)((\s\S+)?\n.*\n\1(\n|$))/\2/
    ta
    s/^\n//;tb
    D;:b;x
' file1.txt file2.txt
while IFS= read -r l <&3; do
  read -r a b <<<"$l"
  grep -qFe "$a" file1.txt &&
  grep -qFe "$b" file1.txt &&
  printf '<%s>\n' "$l"
done 3< file2.txt

관련 정보