a
문자열 목록과 개행 문자, 문자열 목록과 개행 문자가 포함된 파일을 생성하는 명령이 있습니다 b.txt
. a
출력과 내용의 대칭적 차이를 계산하는 명령이 필요합니다 b.txt
. 이상적으로 이 명령은 a
매우 느릴 수 있으므로 파이프라인에서 실행해야 합니다 .
벤 다이어그램이 마음에 드신다면(Wikipedia):
예제에 더 관심이 있는 분들을 위해:
a
산출
apple
car
b.txt
banana
car
dog
그렇다면 결과는 다음과 같아야합니다.
apple
banana
dog
답변1
당신은 그것을 사용할 수 있습니다프로세스 교체명령의 출력을 파일로 처리합니다.
comm -3 <(a | sort) <(sort b.txt)
답변2
comm
파일을 개별적으로 정렬한 다음 이를 사용하여 공통되지 않은 줄을 찾으면 정렬 솔루션이 조금 더 빨라질 수 있습니다.
sort a.txt -o a.txt
sort b.txt -o b.txt
comm -3 a.txt b.txt | sed 's/^\t//'
또는 데이터 파일 중 하나가 너무 크지 않은 경우 이를 모두 연관 배열로 읽어온 다음 다른 파일을 한 줄씩 비교할 수 있습니다. 예를 들어 awk를 사용하면 다음과 같습니다.
awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END { for(i in item)if(item[i]==1)print i }
' a.txt b.txt
ARGIND
파일 매개변수는 위에서 계산됩니다. 첫 번째 줄은 파일의 한 줄을 배열에 저장합니다 item
. 다음 줄에서는 파일 2의 현재 줄이 이 배열에 있는지 확인합니다. 그렇지 않은 경우 인쇄됩니다. 그렇지 않으면 해당 항목이 두 파일 모두에 나타나는 것을 알 수 있습니다. 마지막으로 두 파일 모두에서 볼 수 없는 항목을 인쇄합니다.
파일 중 하나가 다른 파일보다 훨씬 작은 경우 항목 배열이 작게 유지되도록 해당 파일을 args에 먼저 넣는 것이 좋습니다.
if [ $(wc -l <a.txt) -lt $(wc -l <b.txt) ]
then args="a.txt b.txt"
else args="b.txt a.txt"
fi
awk '
ARGIND==1 { item[$0] = 1; next }
ARGIND==2 { if(!item[$0])print; else item[$0] = 2 }
END { for(i in item)if(item[i]==1)print i }
' $args
답변3
차이점을 확인하기 위한 훌륭한 도구입니다 diff
. 출력 형식을 올바르게 지정하려면 중요한 옵션을 조금만 사용해 보면 됩니다.
diff --unchanged-group-format= --new-group-format="%>" a b.txt
파이프 파일이 아닌 경우 a
다음을 사용해야 합니다 -
.
echo 'apple
car' | diff --unchanged-group-format= --new-group-format='%>' - b.txt
산출:
apple
banana
dog
또는 파일에 줄이 나타나는 컨텍스트에 관심이 없는 경우:
echo 'apple
car' | sort | diff --unchanged-group-format= --new-group-format='%>' - <(sort b.txt)