0

I have a file containing a list of information looks something like this:

#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"
...
..
.

with more than 25 000 lines I need to create separate files (5000 files.xml) so first line is FILENAME second to fifth lines are informations that need to be fields in xml file that looks like this:

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

Can someone help me with the script?

So far I have removed # form FILENAME from the document and done something like this:

But can't manage to create multiple files

#!/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
  • What is the output of your script? – Scottie H Sep 17 '19 at 0:51
0
  1. You could split your file popis.txt into 5000+ temporary files with the split (GNU coreutils) command:

    split -d -a4 -l5 popis.txt split
    

    This creates the files split0001, split0002, ... with five lines per file and makes further processing a bit easier.

  2. Create this modified script of yours and save it as 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. Make your script executable and run the script on all splitXXXX files:

    chmod +x script.sh
    ./script.sh split*
    
  4. If everything went well, this should have created one XML file for each input file and you can remove the temporary files:

    rm split*
    
| improve this answer | |
  • Thanks, it worked.. – Levicki Sep 17 '19 at 2:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.