문서를 한 줄씩 읽고 동일한 문서에 미리 정의된 파일 이름을 사용하여 여러 문서를 만드는 Bash 스크립트

문서를 한 줄씩 읽고 동일한 문서에 미리 정의된 파일 이름을 사용하여 여러 문서를 만드는 Bash 스크립트

다음과 같은 정보 목록이 포함된 파일이 있습니다.

#FILENAME "Some name - some title.xml"    
<song>some song</song>
<year>1994.</year>
<album>Some album</album>
<artist>some artist</artist>
#FILENAME "another filename - some have ' in title title.xml"
<song>another song</song>
<year>1996.</year>
<album>another album</album>
<artist>another artist</artist>
#FILENAME "yet another filename - something.xml"
...
..
.

25,000줄이 넘는 경우 별도의 파일(5000개 files.xml)을 만들어야 하므로 첫 번째 줄은 FILENAME이고 두 번째부터 다섯 번째 줄은 다음과 같이 xml 파일의 필드가 되어야 하는 정보입니다.

<?xml version='1.0' encoding='UTF-8'?><Metadata>    <artist></artist>    <song></song>    <album></album>    <year></year></Metadata>

누군가 스크립트 작성을 도와줄 수 있나요?

지금까지 문서에서 #form FILENAME을 제거하고 다음을 수행했습니다.

하지만 여러 파일을 만들 수는 없습니다

#!/bin/bash



while read line; 
if  [[ $line == FILENAME* ]]; then
     filename="${line:9}"

fi
if [[ $line == *artist*  ]]; then
    artist=$line
fi
if [[ $line == *song* ]]; then
    song=$line
fi
if [[ $line == *album* ]]; then
    album=$line
fi
if [[ $line == *year* ]]; then
    year=$line
fi

do

    echo "<?xml version='1.0' encoding='UTF-8'?><Metadata>    $artist    $song    $album    $year</Metadata>"

done < popis.txt > $filename

답변1

  1. 다음 명령을 사용하여 파일을 popis.txt5000개 이상의 임시 파일로 분할할 수 있습니다.나뉘다 (GNU coreutils) 명령:

    split -d -a4 -l5 popis.txt split
    

    split0001이렇게 하면 각각 5줄을 포함하는 , , ... 파일이 생성되고 split0002추가 처리가 더 쉬워집니다.

  2. 수정된 스크립트를 작성하고 다음 이름으로 저장하십시오 script.sh.

    #!/bin/bash
    
    for file; do
      while read -r line; do
        if [[ "$line" = "<artist>"* ]]; then
          artist=$line
        elif [[ "$line" = "<song>"* ]]; then
          song=$line
        elif [[ "$line" = "<album>"* ]]; then
          album=$line
        elif [[ "$line" = "<year>"* ]]; then
          year=$line
        else
          # remove prefix `#FILENAME "` and the last quote `"`
          filename=$(echo "$line" | sed 's/[^"]*"//;s/"[[:space:]]*$//')
        fi
      done < "$file"
      echo "<?xml version='1.0' encoding='UTF-8'?><Metadata>${artist}${song}${album}${year}</Metadata>" > "$filename"
    done
    
  3. splitXXXX스크립트를 실행 가능하게 만들고 모든 파일에서 실행하십시오.

    chmod +x script.sh
    ./script.sh split*
    
  4. 모든 것이 순조롭게 진행되면 각 입력 파일에 대한 XML 파일이 생성되어야 하며 임시 파일을 삭제할 수 있습니다.

    rm split*
    

관련 정보