stackoverflow 커뮤니티에서 유사한 다른 링크를 찾았지만 내 질문에 정확히 답변하지 않았습니다.
줄 수가 다른 2개의 파일이 있지만 둘 다 정렬했습니다. 내 원본 파일의 길이는 수백 줄이었지만 문제 해결을 위해 file1을 12줄로, file2를 5줄로 설정했습니다. 파일 2는 파일 1의 하위 집합입니다. 내가 원하는 것은 file1에는 있지만 file2에는 없는 모든 줄을 출력하는 명령을 실행하는 것입니다.
Unix 명령을 사용해 보았 diff
으나 comm
모두 file1의 전체 내용을 나열했는데 이는 내가 원하는 것이 아닙니다.
간단한 예는 다음과 같습니다:
File1 File2
A B
B E
C I
E N
G O
I
L
M
N
O
X
여기서는 file2의 모든 내용이 file1에 있음을 알 수 있습니다. 어떤 이유로 diff
둘 다 comm
file1의 전체 내용을 표시합니다. 전체 파일을 검색하는 것이 아니라 한 줄씩 비교를 하기 때문인 것 같습니다.
내가 기대하는 결과를 출력하는 또 다른 Unix 명령이 있습니까?
편집: 내가 원하는 것을 얻기 위해 사용하는 명령은 다음과 같습니다.
a) 파일 1을 파일 2와 비교
이는 기본적으로 file1의 모든 항목을 < 앞에 나열하여 내용이 file1의 내용임을 표시하고 앞에는 file2의 모든 항목을 나열하는 >를 표시합니다. 확실히 나한테 필요한 건 아닌데
b) 통신-23 문서 1 문서 2
이는 예상한 차이점이 아닌 file1의 전체 내용을 다시 보여줍니다. 나도
다) 의사소통-3 문서 1 문서 2
comm의 도움말 페이지에 따르면 파일 1의 행은 인쇄되지만 파일 2의 행은 인쇄되지 않거나 그 반대의 경우도 마찬가지입니다. 그러나 B/C 예제에서는 B가 두 파일 모두에 나타나지만 원하는 내용은 표시되지 않습니다. 다른 라인. 그러나 출력에서는 그것이 하나에 있고 다른 하나에는 없다고 생각하여 인쇄합니다. 따라서 출력은 다음과 같습니다.
A
B
B
C
E
E
etc.
이것은 내가 기대했던 것이 아닙니다. 기대하고 있어요
A
C
G
L
M
X
답변1
파일 A에서 파일 b의 내용을 역그레핑하면 됩니다.
예:
francois@zaphod:/tmp$
cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$
여기의 출력은 파일 b에는 없는 파일 A의 행입니다.
답변2
Diff 출력은 파일 X를 파일 Y로 변환하기 위해 수행해야 하는 작업을 보여줍니다.
귀하의 의견에 따라 다음 oneliner를 사용할 수 있습니다.
cat x y | sort -u | cat y - | sort | uniq -u
그럴 것이다
- 두 개의 파일 읽기
- 정렬하고 고유한 행만 인쇄합니다(
-u
순서대로). - 파일(y)을 읽고 파이프 출력과 결합
- 리조트 출력
-u
한 번(고유하게) 발생하는 행만 사용 되도록 uniq를 사용합니다 .
이 방법은 집합 이론을 기반으로 합니다. 먼저 두 그룹을 더한 다음 하나를 뺍니다.
답변3
파일 중 하나가 DOS 형식의 텍스트 파일이고 다른 하나가 Unix 형식의 텍스트 파일인 경우 해당 줄의 문자가 동일하더라도 각 줄은 다른 파일의 모든 줄과 다릅니다. 이는 한 파일의 각 줄 끝에 추가 캐리지 리턴 문자가 있지만 다른 파일에는 없기 때문입니다.
Unix 텍스트 파일인 반면 DOS 텍스트 파일인 comm -3 file1 file2
경우 다음과 같은 출력이 나올 것으로 예상했습니다 (이것이 여러분이 가지고 있는 것입니다).file1
file2
A
B
B
C
E
E
G
I
I
L
M
N
N
O
O
X
DOS 텍스트 파일이고 Unix 텍스트 파일 인 comm -3 file1 file2
경우 다음과 같은 출력이 예상됩니다 .file1
file2
A
B
B
C
E
E
G
I
I
L
M
N
N
O
O
X
두 파일의 줄 끝이 동일한 경우(예: 둘 다 DOS 텍스트 파일이거나 둘 다 Unix 텍스트 파일인 경우) 예상되는 출력은 다음 comm -3 file1 file2
과 같습니다.
A
C
G
L
M
X
다음 명령을 사용하여 이 두 파일을 Unix 텍스트 형식으로 변환할 수 있습니다.
dos2unix file1 file2
...이미 dos2unix
유틸리티가 설치되어 있다고 가정합니다.