2014-07-21 4 views
-2

나는 목록을 가지고 :분리 섹션

### To Read: 
    One Hundred Years of Solitude | Gabriel García Márquez 
    Moby-Dick | Herman Melville 
    Frankenstein | Mary Shelley 
    On the Road | Jack Kerouac 
    Eyeless in Gaza | Aldous Huxley 
    ### Read: 
    The Name of the Wind (The Kingkiller Chronicles: Day One) | Patrick Rothfuss | 6-27-2013 
    The Wise Man’s Fear (The Kingkiller Chronicles: Day Two) | Patrick Rothfuss | 8-4-2013 
    Vampires in the Lemon Grove | Karen Russell | 12-25-2013 
    Brave New World | Aldous Huxley | 2-2014 

나는 별도의 문자열로 다양한 분야를 분리하는 파이썬의 string.split(' | ') 같은 것을 사용하기 좋아하지만, 두 개의 섹션이 있기 때문에 것 필드 수가 다르다면, 나는 그들을 다르게 대우해야한다고 생각합니다. '### To Read :'와 '### Read :'사이의 줄을 선택하고 '### Read :'다음에 줄을 선택하고 나누는 방법은 무엇입니까? awk 또는 sed를 사용해야합니까?

+4

예상되는 결과는 무엇입니까? –

+0

파이썬에서이 코드를 사용할 수 있다는 것을 알고 있습니다 :'x = "kj, ui, rt, we, sd, ggh, hk, yu"; x.split (',')'를 반환하고'[ 'kj', 'ui', 'rt', 'we', 'sd', 'ggh', 'hk', 'yu']'를 반환합니다. 나는 비슷한 것을하고 싶다. '| '[고백의 백 년], [가브리엘 가르시아 마르케스] '와 같은 것을 나에게 주려고했다. –

+1

목록의 출력을 원하셨습니까? –

답변

0

원하는 출력을 지정하지 않았습니다. 그래서, 당신의 질문을 해석, 당신은 파일에서 특정 라인을 읽고, 줄을 '|' 그리고 파이썬리스트와 비슷하게 배열을 bash 배열에 넣는다. 지정된 행에는 ### To Read: 다음에 오는 모든 행이 포함되며 그 행은 ### Read:입니다. 스크립트는 아래에이 작업을 수행하고, 성공을 입증하기 위해, (declare 사용) 배열 표시

active= 
while read line 
do 
    if [ "$line" = '### To Read:' ] 
    then 
     active=1 
    elif [ "$line" = '### Read:' ] 
    then 
     active=1 
    elif [ "$active" ] 
    then 
     IFS='|' my_array=($line) 
     declare -p my_array 
    fi 
done <mylist 

샘플 입력에서 출력은 :이 방법은 쉽게 입력을 처리

declare -a my_array='([0]="One Hundred Years of Solitude " [1]=" Gabriel García Márquez")' 
declare -a my_array='([0]="Moby-Dick " [1]=" Herman Melville")' 
declare -a my_array='([0]="Frankenstein " [1]=" Mary Shelley")' 
declare -a my_array='([0]="On the Road " [1]=" Jack Kerouac")' 
declare -a my_array='([0]="Eyeless in Gaza " [1]=" Aldous Huxley")' 
declare -a my_array='([0]="The Name of the Wind (The Kingkiller Chronicles: Day One) " [1]=" Patrick Rothfuss " [2]=" 6-27-2013")' 
declare -a my_array='([0]="The Wise Man’s Fear (The Kingkiller Chronicles: Day Two) " [1]=" Patrick Rothfuss " [2]=" 8-4-2013")' 
declare -a my_array='([0]="Vampires in the Lemon Grove " [1]=" Karen Russell " [2]=" 12-25-2013")' 
declare -a my_array='([0]="Brave New World " [1]=" Aldous Huxley " [2]=" 2-2014")' 

하는 것으로를 라인의 필드 수가 다르더라도.

0

최종 출력물을 전달하는 방법을 알려주지는 않았지만, 여기에 Awk 솔루션의 골격이 있습니다.

awk -F ' \| ' '/^### To read:/ { s=1; next } 
    /^### Read:/ { s=2; next } 
    s==1 { print $1 "," $2 ",\"\"" } 
    s == 2 { print $1 "," $2 "," $3 }' file 

이렇게하면 첫 번째 하위 섹션에서 빈 제 3 필드가 인쇄됩니다. 당신은 분명히 당신이 더 익숙하다면, 당신이 좋아하는 어떤 것으로 행동을 개조하거나 이것을 파이썬으로 다시 작성할 수 있습니다.