텍스트 파일을 빼는 유닉스 도구?

텍스트 파일을 빼는 유닉스 도구?

큰 테이블 형식의 세미콜론으로 구분된 텍스트 필드로 구성된 큰 파일이 있습니다. 이미 정렬되었습니다. 동일한 텍스트 필드로 구성된 더 작은 파일이 있습니다. 어느 시점에서 누군가 이 파일을 다른 파일과 연결한 다음 정렬하여 앞서 언급한 대용량 파일을 형성했습니다. 큰 파일에서 작은 파일의 줄을 빼고 싶습니다. 즉, 작은 파일의 각 줄에 대해 일치하는 문자열이 큰 파일에 있으면 큰 파일에서 해당 줄을 삭제합니다.

파일은 대략 다음과 같습니다.

GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;

이를 수행하는 빠르고 우아한 방법이 있습니까? 아니면 awk를 사용해야 합니까?

답변1

당신은 그것을 사용할 수 있습니다 grep. 작은 파일을 입력으로 받아 일치하지 않는 줄을 찾도록 지시합니다.

grep -vxFf file.txt bigfile.txt > newbigfile.txt

사용되는 옵션은 다음과 같습니다.

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
   -x, --line-regexp
          Select only those matches that exactly match the whole line.  
          (-x is specified by POSIX.)

답변2

comm당신의 친구입니다:

NAME comm - 정렬된 두 파일을 한 줄씩 비교합니다.

요약 통신 [옵션]... 파일 1 파일 2

설명 정렬된 파일 FILE1과 FILE2를 한 줄씩 비교합니다.

   With  no  options, produce three-column output.  Column one contains lines unique to FILE1, column two contains
   lines unique to FILE2, and column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

( 주문 가능성을 고려하므로 comm성능상의 이점이 있을 수 있습니다 .)grep

예를 들어:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt

관련 정보