我有一个包含信息列表的文件,如下所示:
#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
您可以使用以下命令将文件拆分
popis.txt
为 5000 多个临时文件分裂 (GNU coreutils)命令:split -d -a4 -l5 popis.txt split
这将创建文件
split0001
,split0002
, ...,每个文件包含五行,并使进一步处理变得更容易。创建您的修改后的脚本并将其另存为
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
splitXXXX
使您的脚本可执行并在所有文件上运行该脚本:chmod +x script.sh ./script.sh split*
如果一切顺利,这应该为每个输入文件创建一个 XML 文件,您可以删除临时文件:
rm split*