대칭차관?

대칭차관?

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)

관련 정보