텍스트 파일을 빼기위한 유닉스 도구?


16

큰 테이블 형식으로 세미콜론으로 구분 된 텍스트 필드로 구성된 큰 파일이 있습니다. 정렬되었습니다. 동일한 텍스트 필드로 구성된 작은 파일이 있습니다. 어느 시점에서 누군가가이 파일을 다른 파일과 연결 한 다음 위에서 설명한 큰 파일을 만들기 위해 정렬을 수행했습니다. 큰 파일에서 작은 파일의 줄을 빼고 싶습니다 (예 : 작은 파일의 각 줄에 대해 일치하는 문자열이 큰 파일에 있으면 큰 파일에서 해당 줄을 삭제하십시오).

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

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를 사용해야합니까?

답변:


28

사용할 수 있습니다 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.)

좋았고 완벽하게 일했습니다. 매우 감사합니다.
Escher

1
그것은 효과가 있었지만 멋지지만 -x작은 파일의 줄이 주 파일의 다른 줄의 하위 문자열 인 경우 옵션으로 더 좋을 것 같습니다 . 또한 @UlrichSchwarz의 답변이 더 빠를 수도 있습니다.
rici

18

comm 당신의 친구입니다:

NAME comm-두 개의 정렬 된 파일을 한 줄씩 비교

시놉시스 통신 [OPTION] ... FILE1 FILE2

설명 정렬 된 파일 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

2
정렬 된 목록에 grep over comm을 사용하는 것이 좋습니다. 당신과 같은 특정 명령 줄 예를 준 경우에 더 나은 해답이 될 것입니다comm -1 -3 file.txt bigfile.txt > newbigfile.txt
스티브 Midgley

100MB 정도의 파일로 위에서보고 된 grep 명령을 시도했으며 "killed"오류가 발생했음을 확인합니다. 통신을 시도하면 성공적으로 완료되었습니다.
지안루카 카사 티

명령 재 지정은 정렬되지 않은 파일 또는 두 개 이상의 파일이 필요한 경우에 유용합니다.comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho-Velmont
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.