[+] Bash - Przerobienie linii w pliku

Potrzebujesz pomocy z C, C++, perl, python, itp.
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

[+] Bash - Przerobienie linii w pliku

Post autor: gaijin »

Cześć mam plik według schematu:

Kod: Zaznacz cały

1. 	"...nazwa..." : costam 2008. - s. 192-199
2. 	jakas nazwa : costam 2013. - s. 67-76
3. 	"...nazwa..." : costam 2003. - - s. 232-251
4. 	"...nazwa..." : costam 2003. - s. 18-26
5. 	"...nazwa..." : costam 2015. - - s. 184-200
Rec. : ktostam, nr 3, s. 235-237
6. 	"...nazwa..." : costam 2003. - s. 13-21
Chciałbym aby skrypt usunął 1. do znaku " (numer. spacja spacja) przy czym w niektórych liniach nie ma znaku " oraz istnieją numery (123. ). Pomiędzy liniami jest enter.
Chciałbym też aby linie które zaczynają się od słowa Rec wracały do linii poprzedniej czyli zamiast:

Kod: Zaznacz cały

5. 	"...nazwa..." : costam 2003. - - s. 184-200
Rec. : ktostam, nr 3, s. 235-237
było:

Kod: Zaznacz cały

5. 	"...nazwa..." : costam 2003. - - s. 184-200 Rec. : ktostam, nr 3, s. 235-237
Mnie to zajmie wieki a Wy macie doświadczenie - poratujcie.

Errata. rozwiązałem 1 problem:

Kod: Zaznacz cały

sed -i 's/^[[:digit:]]*.[[:space:]][[:space:]]//' plik.txt
teraz jeszcze REC do poprzedniej linii czyli:
Wytnij linie zawierające na początku słowo REC i wstaw je do poprzedniej linii poprzedzając znakiem spacja.

Moderacja: znaczniki code
Ostatnio zmieniony 01 grudnia 2016, 09:32 przez gaijin, łącznie zmieniany 1 raz.
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: Bash - Przerobienie linii w pliku

Post autor: lizard »

Pierwszy sed jest modyfikacją Twojego (usuwa cudzysłowy z nazw). Drugi łączy linie zgodnie z życzeniem (na podstawie wątku z http://www.linuxquestions.org):

Kod: Zaznacz cały

sed -e 's/^[[:digit:]]\+\.[[:space:]]\+\("\|\)//' -e 's/"\([[:space:]]\+:\)/\1/' text.in | sed -e ':a N' -e 's/\n\(Rec\.\)/ \1/'
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Re: Bash - Przerobienie linii w pliku

Post autor: gaijin »

ok fajnie DZIĘKI za wyjątkiem " bo one akurat maja być ale teraz mam tak. Z tego pliku robię:

Kod: Zaznacz cały

cat plik.txt|grep -i 'nazwisko' > wyniki/nazwisko.txt
potem to tak:

Kod: Zaznacz cały

cat -n wyniki/nazwisko.txt > wyniki/gotowe/nazwisko.txt
Dobrze ale przed numerem w każdej linii są 4-5 spacji...

Jednak jak to zrobić w jednej komendzie?

Kod: Zaznacz cały

sed -n -e '=;p' plik.txt
tu mam numer enter linia
jak dodać numeracje linii kropka [spacja] zawartość linii

MAM:

Kod: Zaznacz cały

awk 'NF { $0=++a " " $0 }; { print }' plik.txt
lizard pisze:Pierwszy sed jest modyfikacją Twojego (usuwa cudzysłowy z nazw). Drugi łączy linie zgodnie z życzeniem (na podstawie wątku z http://www.linuxquestions.org):

Kod: Zaznacz cały

sed -e 's/^[[:digit:]]\+\.[[:space:]]\+\("\|\)//' -e 's/"\([[:space:]]\+:\)/\1/' text.in | sed -e ':a N' -e 's/\n\(Rec\.\)/ \1/'

Kod: Zaznacz cały

sed -e ':a N' -e 's/\n\(Rec. \)/ \1/' plik.txt
I jeszcze to nieszczęsne Rec.
Przy niektórych liniach przesuwa do poprzedniej linii a przy niektórych nie... Przykład:

oryginał:

Kod: Zaznacz cały

678.	Der Einfluss des GWB auf vertragliche Vetriebsformen von Markenwaren, unter besonderer Berucksichtigung des Franchise-Vertrages / Hans Joachim Zeisberg. - Hagen, 1991
Rec. : Bernadeta Fuchs // Pr. Nauk. UŚl., Probl. Praw. Hand. Zagr. - T. 17 (1993), s. 174-175
680.	Der Managementvertrag als internationales Kooperationsinstrument / Sonja Zeiger. - Konstanz, 1984
Rec. : Bernadeta Fuchs // Pr. Nauk. UŚl., Probl. Praw. Hand. Zagr. - T. 13 (1989), s. 178-180
po przerobieniu:

Kod: Zaznacz cały

Der Einfluss des GWB auf vertragliche Vetriebsformen von Markenwaren, unter besonderer Berucksichtigung des Franchise-Vertrages / Hans Joachim Zeisberg. - Hagen, 1991
Rec. : Bernadeta Fuchs // Pr. Nauk. UŚl., Probl. Praw. Hand. Zagr. - T. 17 (1993), s. 174-175
Der Managementvertrag als internationales Kooperationsinstrument / Sonja Zeiger. - Konstanz, 1984 Rec. : Bernadeta Fuchs // Pr. Nauk. UŚl., Probl. Praw. Hand. Zagr. - T. 13 (1989), s. 178-180
Widać iż, w drugim wystąpieniu przesunęło a w 1szym nie...

Ciekawa sprawa. Po-testowałem z dodawanie pozycji oraz Rec. I wygląda, iż gdy zbyt blisko jeden drugiego się znajduje to nie przerabia. Wystarczy zmienić pozycję Rec i już przerabia, dopisać 2 linie niżej i nie przerabia. Myślałem, iż tu chodzi o jakiś konkretny znak który zaburza ale to nie to. Za szybki mam procesor czy jak? Da się jakoś zwolnic wykonywanie polecenia linia po linii?

Mederacja: Scaliłem posty. Proszę używać edycji postów zamiast pisać jeden pod drugim własnym.

Pomogli z forum debian.net

Kod: Zaznacz cały

#!/bin/bash
a=1.txt
b=2.txt
rm -f $b
echo "" >> $a
cat $a|while read line
do if [ -n "$(echo $line|grep "^Rec. ")" ]
then line2="$line2 $line"
else echo $line2 >> $b
line2=$line
fi
done
sed -i '$d' $a 
ODPOWIEDZ