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