노래 파일 목록의 패턴 매칭 및 텍스트 처리

노래 파일 목록의 패턴 매칭 및 텍스트 처리

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

flacmp3or 로 끝나는 줄이 일치하는 것으로 간주되고 , $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

관련 정보