파일 1의 내용(TOP.txt):
/
/boot
/home
/ptd
/ptd/tcd
/ptd/splunkforwarderdd
/ptd/sdt/pqr
/ptd/smr
/ptd/apps/ddas
파일 2 콘텐츠(POp.txt):
/
/boot
/home
/ptd
/ptd/tcd
/ptd/apps/ddas
/ptc/ddd
출력 파일 1(Op1.txt):
/ptd/splunkforwarderdd
/ptd/sdt/pqr
/ptd/smr
출력 파일 2(Op2.txt):
/ptc/ddd
while read linesT; do
TOp=$linesT
while read linesP; do
POp=$linesp
if [[ "$TOp" == "$POp" ]]; then
a=cool
else
echo $TOp
fi
done < POp.txt
done < TOp.txt
위의 코드를 시도했지만 예상대로 작동하지 않았습니다.
TOp.txt
파일이 각 줄을 파일의 모든 줄과 비교 POp.txt
하고 파일에서 누락된 줄을 출력으로 표시하기를 원합니다 TOp.txt
.
파일도 마찬가지입니다 POp.txt
.
답변1
나는 두 파일을 행을 포함하는 텍스트 파일로 생각할 수 있다고 가정합니다. 즉, 파일의 경로 이름 중 어느 것도 리터럴 개행 문자가 포함되어 있지 않으며, 개행 문자가 포함된 경우 어떤 방식으로든 인코딩됩니다(아마도 \n
). 이러한 가정을 통해 comm
정렬된 데이터를 사용하여 각 파일의 고유한 경로 이름을 추출할 수 있습니다. 데이터 정렬은 사용을 위한 필수 사항입니다 comm
.
첫 번째 파일에만 고유한 줄:
comm -23 <( sort TOp.txt ) <( sort POp.txt ) >Op1.txt
파일 중 하나 또는 둘 다 정렬된 경우 프로세스 <( sort ... )
대체 없이 파일을 있는 그대로 사용할 수 있습니다.
두 번째 파일과 관련된 줄만:
comm -13 <( sort TOp.txt ) <( sort POp.txt ) >Op2.txt
기본적으로 comm
세 개의 열이 출력됩니다.
- 첫 번째 파일에 고유한 줄,
- 두 번째 파일에 고유한 줄
- 두 파일 모두에서 줄이 발견되었습니다.
숫자 1, 2 또는 3을 사용하여 -n
열을 "끄기"할 수 있습니다. 예를 들어, 위의 첫 번째 명령에서 와 동일한 을 사용합니다. 이는 기본 출력에서 첫 번째 열을 제외한 모든 열을 끄는 것입니다.n
-23
-2 -3