Bash는 두 목록을 비교하여 누락된 항목을 찾습니다.

Bash는 두 목록을 비교하여 누락된 항목을 찾습니다.

다음은 두 가지 샘플 파일 목록입니다. (파일) 파일 목록(마지막 "/" 오른쪽에 있는 각 레코드의 마지막 "X" 문자)을 비교해야 합니다.

파일 이름을 찾을 수 없으면 전체 줄을 세 번째 파일에 출력으로 보내야 합니다.

이것은 파일 목록입니다. 두 번째 목록에는 3개의 파일이 있을 수 있고, 첫 번째 목록에는 2,000개의 파일이 있을 수 있습니다.
첫 번째:
1 /home/dev/share/Datafiles/cases.dbf
2 /home/dev/share/Datafiles/cells.csv
3 /home/dev/share/Datafiles/clusters.db
4 /home/dev/share/ 데이터파일 /competition.csv
5 /home/dev/share/Datafiles/coplot.csv
6 /home/dev/share/Datafiles/daphnia.csv
7 /home/dev/share/Datafiles/das.txt
8 /home/dev/share /Datafiles/deaths.sas7bdat
9 /home/dev/share/Datafiles/decay.csv
10 /home/dev/share/Datafiles/example.db
11 /home/dev/share/Datafiles/fertyield.lst
12 /home/dev /share/Datafiles/fisher.csv

2개:
1 /test/kitchen/cooks/transfer/cases.dbf
2 /test/kitchen/cooks/transfer/cells.csv
3 /test/kitchen/cooks/transfer/clusters.db
4 /test/kitchen/cooks/ transfer /coplot.csv
5 /test/kitchen/cooks/transfer/das.txt
6 /test/kitchen/cooks/transfer/deaths.sas7bdat
7 /test/kitchen/cooks/transfer/decay.csv
8 /test/kitchen/cooks /transfer/example.db
9 /test/kitchen/cooks/transfer/fertyield.lst
10 /test/kitchen/cooks/transfer/fisher.csv

목록 1에는 있지만 목록 2에는 없는 두 개의 파일: "Competition.csv"(#4) 및 "daphinia.csv"(#6).

파일 정렬이 작동하지 않고, 파일 경로가 매우 짧거나 길 수 있으며, 파일의 여러 복사본이 여러 디렉터리에서 발견될 수 있습니다.

Comm/diff/cmp는 각 줄의 오른쪽에 있는 마지막 "X" 문자(파일 이름, 확장자 기준)만 찾고 있기 때문에 만족스럽지 못한 결과를 낳습니다.
(Microsfot EXCEL에서는 모든 것을 오른쪽으로 추출합니다.) 마지막 "/"를 한 줄씩 다른 목록에 저장한 다음 해당 목록을 첫 번째 목록과 함께 VLOOKUP합니다. )

그러나 이것은 Microsoft 설치가 아닙니다.

목록(파일) 2의 내용과 목록(파일) 1을 검색하는 스크립트, 출력이 파일 3과 일치하지 않습니까?

또한 sed를 사용하여 디렉토리 이름을 구문 분석하고 두 개의 파일 이름 목록만 남기는 것은 어렵습니다. 매번 다르기 때문에 어떤 경로를 대체하고 싶은지 알 수 없습니다. 잘라내기를 시도했지만 파일 이름의 시작 부분은 열 10부터 열 150까지 가능합니다. 내 직감은 파일 경로의 마지막 "/" 오른쪽에 있는 모든 문자를 격리하는 방법이 있어야 한다는 것입니다.

그러면 또 제가 틀렸을 수도 있어요.

답변1

사용 grep:

grep -F -x -v -f <(grep -o '[^/]*$' file2) <(grep -o '[^/]*$' file1) > file3

내부 두 개는 grep각 줄의 파일 이름 부분(마지막 줄 이후의 모든 항목 /)을 반환하고, 외부 grep항목은 첫 번째 내부의 출력을 두 번째 매개 변수의 grep패턴 입력 파일( )로 사용합니다.-f

즉, file1에 있는 file2의 모든 파일 이름을 역순으로 반환합니다( -v). 출력은 file3으로 리디렉션됩니다. 옵션 -F은 정규식 대신 고정 문자열을 일치시키고 -x전체 행을 일치시키는 데 사용됩니다.

콘텐츠 file3:

$ cat file3
competition.csv
daphnia.csv

관련 정보