쉘 스크립트에서 한 파일의 내용을 다른 파일과 한 줄씩 비교하는 방법은 무엇입니까?

쉘 스크립트에서 한 파일의 내용을 다른 파일과 한 줄씩 비교하는 방법은 무엇입니까?

파일 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. 두 파일 모두에서 줄이 발견되었습니다.

숫자 1, 2 또는 3을 사용하여 -n열을 "끄기"할 수 있습니다. 예를 들어, 위의 첫 번째 명령에서 와 동일한 을 사용합니다. 이는 기본 출력에서 ​​첫 번째 열을 제외한 모든 열을 끄는 것입니다.n-23-2 -3

관련 정보