文書を1行ずつ読み取り、同じ文書に事前定義されたファイル名を使用して複数の文書を作成するBashスクリプト

文書を1行ずつ読み取り、同じ文書に事前定義されたファイル名を使用して複数の文書を作成する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で、2行目から5行目は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*
    

おすすめ記事