개인적인 기준에 따라 두 파일을 비교합니다.

개인적인 기준에 따라 두 파일을 비교합니다.

예를 들어 두 개의 텍스트 파일이 있습니다 File1.txt.

A
B
C
E

그리고 File2.txt:

C
D
E

문자는 선을 나타냅니다.

File1.txt의 결과가 아닌 의 모든 결과를 찾고 싶습니다 File2.txt . 두 파일의 결과가 다릅니다.

이것이 어떻게 가능한지? 따라서 이 경우에는 A와 B를 호출해야 합니다.

답변1

정렬되어 있으면 다음을 시도해 보세요.

comm -23 File1.txt File2.txt

정렬되어 있지 않지만 정렬할 수 있는 경우 bash에서 시도해 보세요.

comm -23 <(sort File1.txt) <(sort File2.txt)

File2.txt보다 File1.txt에 더 자주 나타나는 줄은 사용자 uniq나 File1.txt가 아니면 출력됩니다. sort -u이는 귀하의 사용 사례에 적합할 수도 있고 그렇지 않을 수도 있습니다.

파일이 이미 정렬된 경우 대부분의 셸에서 간단한 파이프를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

sort File1.txt | comm -23 - File2.txt

답변2

단순화되었습니다. 감사합니다.@제프 샬러

노력하다:

fgrep -vx -f File2.txt File1.txt

이는 File2.txt의 줄과 일치하지 않는 File1.txt의 모든 줄을 찾는 것입니다.

이전에 알지 못했던 -x 옵션을 사용하면 일치하는 데 완전한 줄이 필요합니다.

-v 옵션은 일치하지 않는 콘텐츠를 표시한다는 의미입니다.

-f 옵션은 파일의 후속 행이 패턴임을 지정합니다.

답변3

빠른 tcsh 스크립트:

#  arg2linesNOTINarg1.csh:
#  tcsh
#  LINES FROM ARG2 THAT ARE NOT IN ARG1
#
if ( $#argv < 2 ) then
   echo ' set fileWITHavoidedLINES = $1 '
   echo ' set fileTOsearch = $2 '
else
   set fileWITHavoidedLINES = $1
   set fileTOsearch = $2
endif
set genSRCHstr =  'awk '"'"'BEGIN { started=0; } \
                          { if (started==0) printf("^%s$",$0);  \
                           else printf("|^%s$",$0) ; started=1 } \
     END { printf("\n") } '"'"' '"${fileWITHavoidedLINES}"' '
egrep -v `eval ${genSRCHstr}` $fileTOsearch

다음을 통해 실행할 수 있습니다:

tcsh arg2linesNOTINarg1.csh File2.txt  File1.txt

줄이 너무 길거나 공백이나 탭과 같은 특정 문자가 포함되어 있으면 검색 문자열을 생성하는 데 문제가 있을 수 있습니다. 어쩌면 이러한 문제를 방지하기 위해 수정될 수도 있지만, 이 제안은 단지 시작에 불과합니다.

답변4

awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file2.txt file1.txt

산출

A
B

관련 정보