[Rozw.] Jak to wydłubać ?

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

czezz
Użytkownik
Posty: 265
Rejestracja: 2004-10-01, 15:23
Lokalizacja: W-wa

[Rozw.] Jak to wydłubać ?

Post autor: czezz »

Mam taki plik textowy, który zaczyna się od liczb odseparowanych "." i na końcu każdego z nich jest [Literka]#.

Wygląda to "mniej-więcej" tak:

Kod: Zaznacz cały

1.5.8 I# werfwetfeterter,
6.5.9 C# sgtrgdfghdfhgfhgfjghjdfnhjgf,
16.5.1 F# erionmiovntuomogjtobyojgmiomtmvt 90 ut jgoitj[iotrjmo,
16.35.11 I# 8o47cnhruihtreuihnuifnhi huiorshmco joiprevpi,
17.5.12 C# filerjmiohugfiojvkfngjkhm ohjioorjg ljirio,op jop,otpm,oij, .
18.5.13 C# trytygfhgfhjjhgjk oprtjuio uiomu ioern.
To co chciałbym uzyskać to 2 kolumny. Pierwsza zawiera [numer]+?# (albo sam numer) i druga kolumna zawierająca opis.

Próbowałem "cut'em"

Kod: Zaznacz cały

cat plik.txt | cut -c0-10
ale ze względu na nieregularną długość liczb wychodzi kasza :(
Może jest jakiś switch który czyta wszystko do wskazanego znaku (np. #) ?

Może ktoś z Was ma jakiś pomysł ?
Ostatnio zmieniony 2007-11-30, 18:48 przez czezz, łącznie zmieniany 2 razy.

Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] Jak to wydłubać ?

Post autor: difrost »

Które cyfry (pola) mają być dokładnie wybrane? Potrzebujesz komplety informacji z wiersza, czy tylko konkretne pola w separacji?

Możesz zastosować grep, sed, awk i cut - w zależności od złożoności wymagać co do pól.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso

czezz
Użytkownik
Posty: 265
Rejestracja: 2004-10-01, 15:23
Lokalizacja: W-wa

Re: [Rozw.] Jak to wydłubać ?

Post autor: czezz »

Pierwsza kolumna to:

Kod: Zaznacz cały

1.5.8 I#
6.5.9 C#
16.5.1 F#
16.35.11 I#
17.5.12 C#
18.5.13 C#
druga kolumna to:

Kod: Zaznacz cały

werfwetfeterter,
sgtrgdfghdfhgfhgfjghjdfnhjgf,
erionmiovntuomogjtobyojgmiomtmvt 90 ut jgoitj[iotrjmo,
o47cnhruihtreuihnuifnhi huiorshmco joiprevpi,
filerjmiohugfiojvkfngjkhm ohjioorjg ljirio,op jop,otpm,oij, .
trytygfhgfhjjhgjk oprtjuio uiomu ioern.
olewam hashe - niech będą w kolumnie z liczbami porządkowymi. Potem je wytnę tr.
Próbowałem też AWK ale wywala całą zawartość pliku :(

Kod: Zaznacz cały

 bash-3.00# cat x.txt | awk {'print $0'}
Ostatnio zmieniony 2007-11-30, 15:19 przez czezz, łącznie zmieniany 1 raz.

Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] Jak to wydłubać ?

Post autor: difrost »

Hmmm...czyli chcesz mieć rozdzielone dwie kolumny: jedna zawierająca cyfry i literkę, druga opis. Wszystko - z tego co zrozumiałem - linijka po linijce:

Kod: Zaznacz cały

while read line ; do
   COL_ONE=$(echo $line | grep -ow '[0-9]*\.[0-9]*\.[0-9]*[[:space:]]*[[:alpha:]]')
   COL_TWO=$(echo $NOHASH | cut -f 2 -d '#')
   echo $COL_ONE
   echo $COL_TWO
done < plik.txt
Ostatnio zmieniony 2007-11-30, 15:29 przez difrost, łącznie zmieniany 1 raz.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso

czezz
Użytkownik
Posty: 265
Rejestracja: 2004-10-01, 15:23
Lokalizacja: W-wa

Re: [Rozw.] Jak to wydłubać ?

Post autor: czezz »

Pięknie dziękuję.
Po kosmetycznych przeróbkach to jest to co chciałem uzyskać:

Kod: Zaznacz cały

while read line ; do
   COL_ONE=$(echo $line | grep -ow '[0-9]*\.[0-9]*\.[0-9]*[[:space:]]*[[:alpha:]]')
   COL_TWO=$(echo $line | cut -f 2 -d '#')
   echo $COL_ONE >> text1.txt
   echo $COL_TWO >> text2.txt
done < plik.txt

Awatar użytkownika
Kalavan
Użytkownik
Posty: 186
Rejestracja: 2007-01-08, 22:09
Kontakt:

Re: [Rozw.] Jak to wydłubać ?

Post autor: Kalavan »

Hmm, a nie dało się cut -d "#" -f 1 dla liczb, a -f 2 dla reszty?
Wiem, # znika, ale nie widzę problemu żeby go dokleić.

Awatar użytkownika
Radek_R
Moderator
Posty: 1196
Rejestracja: 2004-06-14, 11:40
Lokalizacja: Kraków
Kontakt:

Re: [Rozw.] Jak to wydłubać ?

Post autor: Radek_R »

Kod: Zaznacz cały

gawk -F "#" {'print "Linia1 " $1 "# i linia2 " $2'} plik.txt
#358274
http://www.prook.net

Awatar użytkownika
freak117
Użytkownik
Posty: 250
Rejestracja: 2006-12-13, 21:26
Lokalizacja: z sieci

Re: [Rozw.] Jak to wydłubać ?

Post autor: freak117 »

To jeszcze dla formalności dorzucę rozwiązanie z użyciem sed'a:

Kod: Zaznacz cały

cat plik.txt | sed -e 's/\(.*\)#\(.*\)/\1/' > plik1.txt
cat plik.txt | sed -e 's/\(.*\)#\(.*\)/\2/' > plik2.txt
W3 rulez ;D

ODPOWIEDZ