Извлечение данных из TXT-файла и динамическое создание нового файла на основе определенного текста - PullRequest
0 голосов
/ 25 апреля 2018

Мой файл похож на ниже cat Data.txt

****************** abc.txt - Starting point  ********************
abc
asd
asad
asfkn
sadjn
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
fjhdsf
sdjnbs
askd
akdsn
dhskn
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb
****************** xyz.txt - End point  ********************

Я хотел бы получить несколько файлов, созданных динамически на основе начальной и конечной точек.

В выходных данных мне нужны 3 файла: abc.txt ,def.txt ,xyz.txt

>> cat abc.txt 
abc
asd
asad
asfkn
sadjn

>> cat def.txt 
fjhdsf
sdjnbs
askd
akdsn
dhskn

Не могли бы вы помочь мне с командой unix, чтобы сделать это.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вот простое для чтения решение с Bash и grep:

#!/bin/bash

while read line ; do
if FILE=$(grep -P -o '[a-z]*\.txt(?= - Starting)' <<< "$line"); then
F="$FILE"
fi
if ! grep '\*\*\*\*' <<< "$line" ; then
echo "$line" >> "$F"
fi
done

Это дает следующий результат

$ cat file.txt
****************** abc.txt - Starting point  ********************
abc
asd
asad
asfkn
sadjn
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
fjhdsf
sdjnbs
askd
akdsn
dhskn
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb
****************** xyz.txt - End point  ********************
$ cat file.txt | ./go.sh
****************** abc.txt - Starting point  ********************
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
****************** xyz.txt - End point  ********************
$ cat abc.txt
abc
asd
asad
asfkn
sadjn
$ cat def.txt
fjhdsf
sdjnbs
askd
akdsn
dhskn
$ cat xyz.txt
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb
0 голосов
/ 26 апреля 2018

Вот решение AWK:

awk '/^(\*[ ]*)+/ {
    gsub(/(\*[ ]*)+/,"")
    match($0,/[ ]*-[ ]*Starting point/)
    if(RLENGTH>0) fn=substr($0,1,RSTART-1)
    next
}
fn { print $0 > fn }' Data.txt

Предполагается, что между «Конечной точкой» и «Начальной точкой» нет линий.

Результат:

$ cat abc.txt
abc
asd
asad
asfkn
sadjn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...