두 파일의 값을 비교하고 싶은데 위치나 순서를 기준으로 하지 않고

두 파일의 값을 비교하고 싶은데 위치나 순서를 기준으로 하지 않고

다음 내용을 포함하는 두 개의 파일이 있다고 가정해 보겠습니다.

$ cat File1.txt
Apple
orange
watermelon
avocado
lime
$ cat File2.txt
orange
Apple
lime 
watermelon
avocado

둘 다 동일한 값을 갖기 때문에 기본적으로 차이는 없습니다. 나는 diff다음 명령을 사용하고 있습니다 :

diff File1.txt File2.txt

잘못된 값으로 인해 파일이 다르다는 것을 보여줍니다. 제 경우에는 차이가 표시되지 않아야 합니다. 이를 달성할 수 있는 다른 방법이 있습니까? 어떤 제안이라도 환영합니다.

답변1

정렬된 파일을 비교합니다.

Bash(또는 ksh 또는 zsh)에서는 다음을 사용합니다.프로세스 교체:

diff <(sort File1.txt) <(sort File2.txt)

간단히 말해서:

sort File1.txt >File1.txt.sorted
sort File1.txt >File2.txt.sorted
diff File1.txt.sorted File2.txt.sorted

정렬된 파일 간의 차이점을 빠르게 확인하려면,comm유용할 수 있습니다. 한 파일의 행을 직접 표시하지만 다른 파일의 행은 표시하지 않습니다.

comm -12  <(sort File1.txt) <(sort File2.txt) >common-lines.txt
comm -23  <(sort File1.txt) <(sort File2.txt) >only-in-file-1.txt
comm -13  <(sort File1.txt) <(sort File2.txt) >only-in-file-2.txt

동일한 파일에서 한 줄이 반복되는 경우 위 명령은 두 파일의 반복 횟수가 동일하다고 주장합니다. 치료를 원하시면

foo
bar
foo

같은

bar
foo

그런 다음 정렬 시 중복 항목을 제거하세요. sort -u대신 사용하세요 sort.

한 파일의 출력을 저장 sort하고 나중에 다른 파일을 사용할 수 있을 때 이를 사용하는 경우 두 파일 모두 동일한 로케일로 정렬되어야 합니다. 이렇게 하면 아마도 바이트 순서로 정렬해야 합니다.

LC_ALL=C sort File1.txt >File1.txt.sorted

답변2

먼저 파일을 정렬합니다( bash).

diff <(sort file1) <(sort file2)

답변3

awk를 사용하면 다음과 같은 명령을 사용하여 각 텍스트 입력 줄에 대한 해시 인덱스를 만들 수 있습니다.

awk 'The magic' Q=A fileA Q=B fileB Q=C fileC ...

각 입력 라인의 "마법"은 다음과 같습니다.

{ X[$0] = X[$0] Q; }

END 조건에 도달하면 X의 인덱스를 반복합니다. 각 파일에 한 번만 나타나는 줄은 다음과 같습니다.

X["Apple"] = "ABC";

fileA에서 한 번 발생하고 fileC에서 세 번 발생하는 줄은 "ACCC"로 표시됩니다. 원하는 방식으로 파일 수에 관계없이 모든 이상 현상을 보고할 수 있습니다. (저는 각각 라이브 데이터베이스와 Oracle 데이터베이스가 있는 기본 서버와 대기 서버에서 실행되는 안전이 중요한 시스템을 14방향으로 비교해야 했습니다.)

각 레이블에 줄 번호 NR을 포함하고 흥미로운 패턴을 작성하면 레이블을 다음과 같이 만들 수 있습니다.

X["Walrus"] = "A347B38C90"

각 파일의 어느 줄에 일치하는 텍스트가 있는지 보고합니다.

관련 정보