#!/bin/sh
echo "file to split?"
read file
f=0
until ! [ -s $file ];
do
grep -n "<text" $file > titles.txt
lines=$(cat titles.txt| sed -n 2'p' | sed -r 's/^([0-9]*).*/\1/g')
f=$((f+1))
substrac="$(($lines-1))"
head -$substrac $file > $f
sed -i '1,'$substrac'd' $file
echo "file \"$f\" generated"
done
스크립트는 비어 있을 때까지 실행되지만 "titles.txt" 파일에 한 줄이 남거나 $file에 ""가 한 번 나타날 때 $file
까지 실행해야 합니다 .<text
나는 시도했다:
while :
do
count=$(grep "<text" $file | wc -l)
if [ $count > 1 ]
then
그리고:
while :
count=$(cat titles.txt | wc -l);
do
until [ $count -eq 1 ]; do
하지만 그 시점에서 스크립트를 멈출 수는 없습니다. 제가 뭔가 잘못하고 있는 것은 확실하지만 아무것도 찾을 수 없습니다...
답변1
파일이 올바른 형식의 XML 파일이고 <text>
노드를 별도의 파일로 추출하려는 경우 XMLStarlet을 사용하여 다음을 수행할 수 있습니다.
#!/bin/sh
infile="$1"
xmlstarlet sel -t -v '//text/@id' -nl "$infile" |
while read id; do
xmlstarlet sel -t --var id="'$id'" -v '//text[@id = $id]' "$infile" >"$id.txt"
done
명령줄에 다음 파일의 경로 이름을 입력합니다.
<?xml version="1.0"?>
<root>
<text id="cade2296-1">
The first text, called "cade2296-1".
</text>
<text id="cafr3062-1">
The second text, called "cafr3062-1".
</text>
</root>
...이것은 현재 디렉토리에 두 개의 파일을 생성 cade2296-1.txt
하고 cafr3062-1.txt
원본 파일의 두 태그 내용을 포함합니다.<text>
파일 이름은 레이블 id
의 속성 에서 가져옵니다 <text>
. id
이러한 값은 먼저 XML에서 추출된 다음 루프에서 관련 태그 값을 추출하는 데 사용됩니다.
루프 내에서 XMLStarlet 호출을 다음 -v
과 같이 변경하면 다음과 같은 결과를 얻을 수 있습니다.-c
복사<text>
태그의 데이터뿐만 아니라 XML 태그의 콘텐츠입니다.
답변2
예, @George Vasiliou 덕분에 작동하게 만들 수 있었습니다. 이제 스크립트는 다음과 같습니다.
#!/bin/sh
echo "file to split?"
read file
# This variable is to name resulting files
f=0
while :
do
# Count how many occurrences of "<text" are in the file to split
count=$(grep "<text" "$file" | wc -l)
if [ "$count" -gt 1 ]
then
# Send the occurrences of "<text" with their line number to the titles.txt file
grep -n "<text" "$file" > titles.txt
# From the second line of titles get the line number
lines=$(cat titles.txt| sed -n 2'p' | sed -r 's/^([0-9]*).*/\1/g')
# Every time the script is run the resulting file gets the next number as name
f=$((f+1))
# From the line number obtained at the second line substract 1
substrac="$(($lines-1))"
# Create a new file taking the amount of lines indicated by the substraction from the splitting file
head -"$substrac" "$file" > "$f"
# Delete the lines corresponding to the newly created file from the splitting file to start the process over
sed -i '1,'"$substrac"'d' "$file"
echo "file \"$f\" generated"
else
echo "process finished!"
exit 1;
fi
done
설명하다:다음 형식의 거대한 텍스트 파일이 있습니다.
<text id="cade2296-1">
many
undetermined
lines
...
</text>
The same schema repeteated undetermined times
<text id="cafr3062-1">
many
undetermined
lines
...
</text>
내가 필요한 것은 다른 파일의 각 패턴입니다.