2012-06-17 2 views
1

(파일 2)의 (파일 1)에있는 파일 이름에 포함 된 모든 문자에 대해 awk에 대한 최선의 접근 방법은 무엇입니까? 지금까지(파일 2)에서 (파일 1)의 '임의의'문자에 대한 awk

코드 :

$ sed -e 's/.*\ -\ //' -e 's/.mp3$//' File1.txt | while read z; do tit="$z" ; awk -v title="$tit" '{FS = "\t"} $2 ~ title {print $0}' File2.txt ; done 

결과; . 그것은 파일 이름에 (그것을 사용하여 파일을 칠 때를 제외하고 일하고

나는 하나의 내가, 아직 운이 생각할 수있는 모든 것을 인용을 두 번 시도했습니다

을 File1 :. "재생 목록"라는, 구분은 다음과 같습니다 "-"

  • 피터 토시 - 나 고아 감옥 (보너스 트랙) .MP3

은 File1 필드는 "아티스트" "제목"

01 23,516,

있는 File2 :라는 이름의 "마스터 목록", 구분 기호는 다음과 같습니다 탭

  • 피터 토시 나 고아 감옥 32000/음악/피터 토시/피터 토시 - 나 고아 감옥 (보너스 Track.mp3

있는 File2 필드는 "아티스트", "제목", "비트 레이트" "경로"

위의 예제를 사용하여 ...의 각 항목에 대해 "재생 목록"

    필드 1과 필드 2 (아티스트 제목) 일치
  1. 경우 마스터 목록 내부 $ 제목 "나 고아 감옥 (보너스 트랙) .MP3"에 대한
  2. 검색이 개 변수를 생산하는
  3. 사용 "재생 목록"은 $ 확인 아티스트도 일치합니다
  4. $ title 및 $ artist가 일치하면 마스터 목록의 네 번째 열을 인쇄하고 그렇지 않으면 "No Match"를 인쇄하십시오.
+0

+1 첫 번째 게시물은 훌륭하지만 ... ;-) 예상 출력을 추가하십시오. (입력과 출력은 코드로 형식화 될 때 읽기가 쉽습니다.) 행운을 빕니다. – shellter

+1

줄을 읽을 때마다 대신에'-F "\ t"'또는'BEGIN {FS = "\ t"}'를 사용하여 한 번만 필드 구분자를 설정하십시오. –

답변

0

당신이 얻을 수있는 수행하여 동일 (간단) : 기본 공간입니다 루프에 대한

sed -e 's/.*\ -\ //' -e 's/.mp3$//' File1.txt | while IFS='\n' read z; do grep "$z" File2.txt; done 

공지 사항 IFS (내부 필드 분리)의 사용.

+0

감사합니다. 어느 쪽이든 내가 (awk)을 사용하여() - $ % # @와 같은 문자를 무시하는 코드를 수정할 수 있습니까? 파일 이름에? 내 예에서는 file2 안에있는 "Peter Tosh - Reggae Party (Bonus) .mp3"라는 노래 이름을 찾고 있습니다. 일치하면 file2에 전체 행을 반환합니다. 괄호 (그리고 아마도 다른 문자들)는 awk를 트립하고있다. awk를 원 라이너로 사용해야합니다. 고맙습니다. – voiczed

+0

정규 표현식으로 $ z를 사용하고 있으므로 (~ 사용시) 접근법이 작동하지 않습니다. 이 경우 awk에서 특수 문자를 이스케이프 처리해야하지만 길면 '한 줄짜리'가됩니다.당신이 원하는 것을 더 많이 설명하고 왜 awk의 한 줄에 있어야 하는지를 설명한다면 당신을 도울 것입니다. – gpoo

+0

나는 더 많은 것을 설명하기 위해 원래의 글을 편집했다. 감사. 상기 참조하십시오. – voiczed

0
awk 'NR == FNR { artist[$1,$2]=1 ; next }   #Load the artiest/title file 
    NR != FNR { if(artist[$1,$2]) { print $4 } #Check if artiest,title was loaded 
       else { print "no match" } }' artist-title artist-title-bitrate-path