![일치하는 파일 이름으로 전체 경로 추출](https://linux55.com/image/180506/%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C%20%EC%A0%84%EC%B2%B4%20%EA%B2%BD%EB%A1%9C%20%EC%B6%94%EC%B6%9C.png)
내 하드 드라이브에 있는 파일의 전체 경로 목록이 포함된 텍스트 파일이 있습니다. 수천 줄이 될 수 있지만 다음은 내 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
. 같으면 첫 번째 파일입니다.