파일에 한 줄만 남을 때까지 쉘 스크립트를 실행하십시오.

파일에 한 줄만 남을 때까지 쉘 스크립트를 실행하십시오.
#!/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>

내가 필요한 것은 다른 파일의 각 패턴입니다.

관련 정보