awk

Programovacie jazyky, rady, poradňa...
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

awk

Príspevok od používateľa harrison314 »

Takze, mam dva retazce v riadku ( obsahuju medzeri) rozdelene tabulatorom a v tom druhom chcem pridat pred kazdu bodku spetne lomitko.

Skusal som toto:

Kód: Vybrať všetko

 ... | awk '{ gsub("\t.*\\.","\\."); print }' | ...
Ale rezace mi od medzier odrezalo a aj tie zvysky sa nezmenili.
a toto

Kód: Vybrať všetko

...| awk '{ split($0,pole,"\t"); gsub("\\.","\\.",pole[2]); print pole[1],"\t",pole[2] ; }' | ...
v tomto pripade sa nezmenilo nic.
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: awk

Príspevok od používateľa pato83 »

Nazdar, ten prvy nie je dobre, no druhy funguje presne ako si ziadas:

Kód: Vybrať všetko

pato@debian:~$ awk '{ split($0,pole,"\t"); gsub("\\.","\\.",pole[2]); print pole[1],"\t",pole[2] ; }' test.file 
obsa hu je       med \.ze \.r\.y
tvo j    \.a\.w\.k fun\.gu\.je
pato@debian:~$ cat test.file 
obsa hu je      med .ze .r.y
tvo j   .a.w.k fun.gu.je
Pokial to posielas priamo na vstup dalsiemu programu a ten az vypluje vysledok, tak by som sa nan zameral. Alebo daj priklad textu pri ktorom to nefunguje.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: awk

Príspevok od používateľa harrison314 »

Mne sa tie spetne lomitka zazracne stratia uz pri

Kód: Vybrať všetko

 ... | awk ... | (
while read LINE ; do
echo $LINE;
done
)

Este by bolo asi dobre prezradit ze robim v bash2.
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: awk

Príspevok od používateľa pato83 »

Nazdar. Mam par pripomienok ;) :
1. Tvoj awk :

Kód: Vybrať všetko

awk '{ split($0,pole,"\t"); gsub("\\.","\\.",pole[2]); print pole[1],"\t",pole[2] ; }' 
by po spravnosti mal vyzerat takto, ale zjavne funkcionalite to prinajhorsom v tomto pripade neubera:

Kód: Vybrať všetko

awk '{ split($0,pole,"\t"); gsub("\.","\\.",pole[2]); print pole[1],"\t",pole[2] ; }'
2. Namiesto ... pis, co tam mas, ak to nie je tajne ;)
3. To najdolezitejsie nakoniec. Cely problem tkvie prave v read a nie v awk, co bolo jasne uz aj predtym.
Presne tvoj pripad: http://tldp.org/LDP/abs/html/internal.html vid Example 15-5 .
Takze tvoj kod bude fungovat v pripade, ze read je s parametrom -r a to nasledovne:

Kód: Vybrať všetko

#! /bin/bash
echo -e "test\tt.e .s .t" | \
awk '{ split($0,pole,"\t"); gsub("\.","\\.",pole[2]); print pole[1],"\t",pole[2] ; }' | \
while read -r LINE
do 
    echo "$LINE"
done
P.S: Este by ma zaujimalo, co je to ten bash2 ? Co ti vyhodi :

Kód: Vybrať všetko

/bin/bash --version
?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: awk

Príspevok od používateľa harrison314 »

Diki za pomoc, ale nakoniec som to musel riesit inak,
ale read -r sa mi zide,
bash2 je bash verzia 2 ( aj nieco ) , ide od FreeBSD z 93, tak tam nefunguje vsetkoa ako na dnesnych distribuciach.
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: awk

Príspevok od používateľa pato83 »

Cisto zo zvedavosti ma zaujima, co ta nuti pouzivat tak stary system (1993? ) ?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: awk

Príspevok od používateľa harrison314 »

STU FIIT - Operacne systemy

Teraz vyskocil dalsi problem:

Kód: Vybrať všetko

path="/home/nieco/. "
echo "$path" | awk '{gsub("\\","\\\&"); print ' | read -r path
echo ">$path<"
Vystup je "/home/nieco/." - na konci mi chyba medzera a netusim preco
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: awk

Príspevok od používateľa pato83 »

Za posledny riadok pridaj:

Kód: Vybrať všetko

echo "${#path}"
a taktiez:

Kód: Vybrať všetko

echo "$path$path"
Alebo mi vysvetli, ako si zistil, ze tam nie je?
A taktiez, pokial ide o text (string) a v hodnota premennej neobsahuje dalsiu premennu alebo nejaku akciu (spusta sa tam program ...),
tak je vhodne pouzivat jednoduche uvodzovky:

Kód: Vybrať všetko

VAR='test'
Inak, nechapem naco toto?

Kód: Vybrať všetko

path="/home/nieco/. "
echo "$path" | awk '{gsub("\\","\\\&"); print ' | read -r path
echo ">$path<"
ked to moze byt aj takto, to read -r path je tam uz zbytocne, pokial tam nie je cyklus:

Kód: Vybrať všetko

PATH='/home/nieco/. '
PATH="$( echo "$PATH" | awk '{gsub("\\","\\\&"); print }' )"
echo "${#PATH}"    # pocet znakov hodnoty, snad to funguje u teba
echo ">${PATH}<"
Napísať odpoveď