일치하는 파일 이름으로 전체 경로 추출

일치하는 파일 이름으로 전체 경로 추출

내 하드 드라이브에 있는 파일의 전체 경로 목록이 포함된 텍스트 파일이 있습니다. 수천 줄이 될 수 있지만 다음은 내 volume_content.txt파일 의 예입니다 .

/Volumes/NEW TVC/20200901/CAM_A/VID_A002C001.mov
/Volumes/NEW TVC/20200901/CAM_A/VID_A002C003.mov
/Volumes/NEW TVC/20200901/CAM_A/VID_A003C003.mov
/Volumes/NEW TVC/20200901/CAM_B/CARD01/20200905/TVC.mov

footages.txt내부에 검색 키워드가 있지만 이러한 키워드는 파일 이름만 참조해야 한다고 가정해 보겠습니다 .

A002
TVC

내가 사용한다면

footage=$(cat footages.txt)
cat volume_content.txt | grep "${footage}"

volume_content.txt각 행에는 패턴이 있으므로 결국 my 의 전체 내용을 수집하게 됩니다 TVC.

grep정렬을 두 번 사용하여 올바른 행을 추출 했습니다 .

footage=$(cat footages.txt)
cat volume_content.txt | sed 's!.*/!!' | grep "${footage}" > footage_filename.txt
footage_filename=$(cat footage_filename.txt)
cat volume_content.txt | grep "${footage_filename}" > all_footages.txt

결과는 이렇습니다. 제가 원하는 것은 다음과 같습니다.

/Volumes/NEW TVC/20200901/CAM_A/VID_A002C001.mov
/Volumes/NEW TVC/20200901/CAM_A/VID_A002C003.mov
/Volumes/NEW TVC/20200901/CAM_B/CARD01/20200905/TVC.mov

이를 달성하는 쉬운 방법(아마도 한 줄)이 있습니까?

답변1

다음 줄이 작동합니다.

awk -F'/' 'NR==FNR {pat=pat ? pat "|" $0 : $0; next} $NF ~ pat' footages.txt volume_content.txt 

footages.txt각 줄에서 읽은 ORed 개별 패턴으로 구성된 정규식을 처리하고 생성하는 것으로 시작됩니다 . 정규식은 pat예제와 유사한 내부 변수에 저장됩니다 . A002|TVC다소 비밀스러운 pat=pat ? pat "|" $0 : $0의미는 " pat이미 사용된 경우 설정하고, pat=pat "|" $0그렇지 않은 경우 설정 pat=$0"입니다.노트그 안에 있는 패턴이 실제 정규식 자체라면 더 많은 노력이 필요합니다 footages.txt!

처리할 때 volume_content.txt각 행을 분할 /하고 마지막 경로 구성 요소가 이전에 조합된 정규 표현식과 일치하는지 확인합니다 pat. 그렇다면 해당 행을 인쇄하십시오(조건 $NF ~ pat때문에외부모든 규칙 블록은 "true"로 평가됩니다).

어쨌든 전체 행만 고려하므로 필드 구분 기호로 설정해 /도 구문 분석이 방해되지 않습니다 .footages.txt

첫 번째 파일을 처리하는지 아니면 후속 파일을 처리하는지의 차이는 NR==FNR전역 라인 카운터를 파일별 라인 카운터와 NR비교하는 조건을 통해 결정됩니다 FNR. 같으면 첫 번째 파일입니다.

관련 정보