예를 들어 두 개의 텍스트 파일이 있습니다 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