file2
두 개의 파일이 있는데 에 있지만 에는 없는 파일이 포함된 새 파일을 생성하려고 합니다 file1
. 원본 파일은 정렬되지 않습니다.
이제 까다로운 부분이 있습니다. 파일의 일부 줄은 다음 형식을 따릅니다.
./$ARTIST/$ALBUM/$N1 - $N2 - $TITLE.(flac|mp3)
./$ARTIST/$ALBUM/$N1 - $TITLE.(flac|mp3)
./$ARTIST/$ALBUM/$N1. $TITLE.(flac|mp3)
$N1
여기서 합계 $N2
는 1~3자리 숫자입니다(예 01
: 12
, ,132
$ARTIST
, 및 -를 포함한 임의의 영숫자 문자로 구성될 수 있지만 /는 포함되지 않습니다 $ALBUM
.$TITLE
flac
mp3
or 로 끝나는 줄이 일치하는 것으로 간주되고 , $ARTIST
해당 줄이 제외되기를 원합니다 .$ALBUM
$TITLE
예file1
./The BEATLES/white album/01. Revo-lution.flac
./123-123/234-234/01 - 02 - 3769.flac
./THE BEATLES/abbey road/cover.jpg
예file2
./The BEATLES/white album/01. Notinfile1.flac
./123-123/234-234/03. 3769.flac
./THE BEATLES/abbey road/cover.jpg
결과물 파일
./The BEATLES/white album/01. Notinfile1.flac
편집하다:
저는 이 문제에 대해 생각해 보고 해결책을 찾았지만 코딩을 도와줄 사람이 필요합니다.
두 파일의 각 줄에 대해 다음 방법을 사용하여 키를 생성할 수 있습니다. 파일 간의 키에 대한 후속 비교는 file2
키가 파일의 키와 일치하지 않는 행을 출력하는 데 사용될 수 있습니다 .file1
키는 다음과 같이 생성됩니다.
flac
행이 또는 로 끝나지 않으면 mp3
키는 행 자체입니다.
그렇지 않으면 첫 번째 발생 .
또는 -
마지막 발생을 확인하십시오 /
.
이 경우 핵심은 .
포인트 뒤의 콘텐츠가 $ARTIST/$ALBUM/$TITLE
있는 위치 입니다.$TITLE
이 -
경우, 마지막 줄 다음 줄 부분의 대시 수를 세십시오 /
.
$ARTIST/$ALBUM/$TITLE
발견된 경우 대시 뒤의 콘텐츠가 있는 위치가 키입니다 .$TITLE
두 개 이상의 대시가 발견되면 첫 번째 대시와 두 번째 대시 사이의 내용이 순전히 숫자와 공백인지 확인하세요. 그렇다면 $TITLE
두 번째 대시 이후입니다. 그렇지 않은 경우 $TITLE
첫 번째 대시 이후.
누군가 내가 코딩하는 것을 도와줄 수 있나요?
답변1
파일을 정렬된 순서로 정렬하면 파일을 비교할 때 유용할 때가 많습니다. 중복 항목을 제거하여 -u
출력의 각 행을 고유하게 만듭니다 .
sort -u file1 > file1.sorted
sort -u file2 > file2.sorted
comm
정렬된 파일을 비교할 수 있지만 리터럴 텍스트만 가능합니다. 따라서 문제는 줄어들지만 정확히 일치하는 항목만 필터링됩니다. -1
첫 번째 파일에 고유한 줄을 제거하고 -3
두 파일 매개변수에 공통된 줄을 제거합니다. 그러면 두 번째 파일에 고유한 줄이 남게 됩니다.
comm -1 -3 file1.sorted file2.sorted > file2.reduced
이제 우리는 이 (희망적으로) 더 작은 파일에 대해 복잡한 작업을 수행하면 됩니다.
sed 's#^\./##' file2.reduced | while read line; do
artist_album=${line%/*}
filename=${line##*/}
title=$(echo "$filename" | sed 's/^[0-9]\{1,3\}\. //;t;s/^[0-9]\{1,3\} - [0-9]\{1,3\} - //;t;s/^[0-9]\{1,3\} - //')
extension=${title##*.}
title=${title%.$extension}
# We use fixed strings in case there are special chars in the file name
# If the file names are "regex-save" we can use one grep instead:
# ! grep -q -E "^\./$artist_album/.*$title\.(mp3|flac)\$" file1.sorted
if ! grep -F "./$artist_album/" file1.sorted | grep -F -e "$title." | grep -q -E '(mp3|flac)$'; then
echo "./$line"
fi
done > results