Mam następujący powtarzający się wzór tekstu, który należy ponownie sformatować.
Normalnie powinno to być łatwe, nawet przy użyciu standardowego edytora tekstu, ale w tym przypadku muszę rozwinąć informacje w nawiasie i wyliczyć je.
Najlepiej podam przykład:
"Gene Code (1A - 1F) D2 fragment, D74F"
Muszę być w stanie wyglądać tak:
Gene Code, 1A, D2 fragment, D74F
Gene Code, 1B, D2 fragment, D74F
Gene Code, 1C, D2 fragment, D74F
Gene Code, 1D, D2 fragment, D74F
Gene Code, 1E, D2 fragment, D74F
Gene Code, 1F, D2 fragment, D74F
Problem polega na tym, że początkowy łańcuch zawarty w nawiasie może mieć postać 1A-1F lub 3D-3H itp. Jest to jedyne przesunięcie bitów informacji. Numer w nawiasie jest zawsze taki sam, tylko litery alfabetu wymagają rozszerzenia wraz z przypisanym im numerem.
Potrzebna jest więc korelacja alfabetu z liczbami.
Dla mnie wygląda to na zginanie umysłu. Każda pomoc bardzo doceniana. Nawiasem mówiąc, nowy w tym.
bash
sed
awk
text-editing
jeffschips
źródło
źródło
Odpowiedzi:
Ten skrypt basha
Zrobi to, czego potrzebujesz, choć nie w bardzo wydajny sposób, gdy zostanie wywołany z oryginalnym tekstem jako
$1
EDYTOWAĆ
Na prośbę kilka słów o
sed
wyrażenia:PART1
biorąc wszystko przed spacją i otwarcie(
PART3
biorąc wszystko od zamknięcia)
dalejPART2
biorąc to, co jest pomiędzy(
i)
, ignorując białe znakiSTART
iEND
są izolowane myślnikiem, ponownie ignorując białe znakiźródło
\s
to ...\s
jest tylko dla solidności: Ignoruj lub poprawnie przetwarzaj białe znaki wokół odpowiednich części. Wszystko inne powinno być dość samo-wyjaśniające.Jeśli dostępny jest GNU sed
Jeśli nie, uruchom go wysyłając jako potok do powłoki
(z
sh
iksh
wyjście jest takie samo)źródło
Perlowy sposób:
Wydajność:
źródło
Wersja, która nie wymaga pętli, i używa tylko czterech wywołań sed. Oczywiście moja wersja nie sprawdza, czy obie liczby są równe. W rzeczywistości drugi jest ignorowany i można go nawet pominąć, tak jak w przypadku
"Gene Code (91K - Q) D2 fragment, D74F"
. Również dolna granica i górna granica mogą pojawić się w dowolnej kolejności. Jeśli dolna granica jest większa niż górna granica, to sekwencja wyjściowa jest odwrócona.Przykładowe wyjście:
Odwrócenie granic powoduje odwrócenie wyjścia:
źródło