Lenne egy olyan sor:
dátum(pl 2008.05.01. 12:23:22) szöveg szám szöveg szám ....
hogy tudnám a dátum után kiszedni a számokat?
Egyértelmű szeparátor sincsen benne és szinte teljesen össze vissza forul elő szám.
- 1304 megtekintés
Hozzászólások
gawk-al sokkal egyszerubb lenne. Ez nem igazan sed-nek valo feladat.
- A hozzászóláshoz be kell jelentkezni
Esetleg így:
cat test | sed 's/[a-z][0-9]//g'
- A hozzászóláshoz be kell jelentkezni
Ez nagyon nem lesz jó, mivel töröl minden kisbetűt követő számjegyet, algernoné már jobb, de még abban is bentmarad a dátum és a szövegrészben előforduló számjegy.
Nézzük meg így:
sed -re 's/(^.{20}[ \t]*|[^ \t]*[^0-9 \t][^ \t]*[ \t]*)//g' -e 's/ $//' <testfile
- A hozzászóláshoz be kell jelentkezni
| sed -e "s,^datum-regexp,," -e "s,[^0-9 ],,g"
Ha "szoveg"-ben van szam, ez azt is elkapja.
- A hozzászóláshoz be kell jelentkezni
hát sajna nem jön össze
- A hozzászóláshoz be kell jelentkezni
Kell helyettesíteni valamivel? vagy csak kapkodja ki, a számokat? mert c-ben ez pár sor. Ha kell megíron.
- A hozzászóláshoz be kell jelentkezni
sed -e 's/^[^ ]* [^ ] *//' -e 's/[^0-9 ][^0-9 ]*/ /g' -e 's/ */ /g' < szoveg.txt
Az első -e utáni rész kidobja a dátumot (és azt azt követő szóközöket); a következő -e utáni minden 1-vagy-több nem-számjegyből (és nem-szóközből) álló részt kicserél 1 db szóközre; a 3. -e után pedig a sok szóközt 1-re cseréljük.
És ha jól gondolom, az eredmény néhány db szóközökkel elválasztott szám.
- A hozzászóláshoz be kell jelentkezni
"az eredmény néhány db szóközökkel elválasztott szám"
néhány db szóközökkel elválasztott számjegy a dátum órájának második számjegyétől, beleértve a szöveg részét képező számjegyeket is. :)
Legalábbis az alábbi tesztállománnyal próbálva:
2008.05.01. 12:23:22 asda3da 37363633 sjs 434 ujuj 6 jsdjs 7
2008.06.02. 12:25:24 a 373633 sj2as 55 u 8 j 777
2008.06.02. 12:25:24 aj 3733 sj2as 55 u7 8 j 777 t
- A hozzászóláshoz be kell jelentkezni
Tesztadatokkal már könnyebb.
1) kihagytam az első -e paraméterből egy "* "-ot.
2) így, hogy kapunk némi támpontot, lehet javítani a kódot. A fentiek alapján akkor azt feltételezem, hogy egy "szemét" egy szám formájú a dolog, ahol a "szemét" tartalmaz számjegyen kívül mást is.
- A hozzászóláshoz be kell jelentkezni
Félreértés ne essék, én csak a topiknyitó leírása alapján tenyereltem bele a billentyűzetbe, ez nem a topiknyitó kaltsi által adott tesztadat, így én is csak bízni tudok abban, hogy ilyen formátumra gondolt.
Egyébként egy feljebb lévő hozzászólásban már tettem egy javaslatot a megoldásra, remélem jót.
- A hozzászóláshoz be kell jelentkezni
csak most tudtam megint írni.
itt egy teszt adat:
00:01 2008.04.24 ---> I4M SSM/Result/II_PREF <> Result/CP/Cl/REF ("85040"<>"483").
00:02 2008.04.24 ---> I4M In/CC/CP/T="737" fix.
de nekem ez sem megy
echo a0b1c2d3e4f5g6h7i8j9k | awk '{for (alma=1;alma<=length($0);alma++){ if ((substr($0,alam,1)<"0") || (substr($0,alam,1)>"9")) {print substr($0,alma,1);}}}'
- A hozzászóláshoz be kell jelentkezni
nemtom hogy a 'kiszedni'-t hogy erted, de vhogy igy:
#!/usr/bin/awk -f
BEGIN {
FS="\""
ORS=""
}
{
print substr($0, 0, 18)
for(i=2; i <= NF; i++) {
if ($i ~ /[0-9]+/) {
print " " $i
}
}
print "\n"
}
- A hozzászóláshoz be kell jelentkezni
A "--->" az mindenhol elválasztja a dátumot a szövegtől?
Mert akkor előbb seddel törlöd a dátumot, azután awk-val kiíratod a csak a számokat, ha jól látom a " akár Field Separator is lehet:
sed 's/^.*--->\(.*\)$/\1/' | awk ...
- A hozzászóláshoz be kell jelentkezni
Ha a karakterszam a sor elejen mindig allando, miert nem csapod le egyszeruen az elso 16-ot?
- A hozzászóláshoz be kell jelentkezni
Na de awk? A topik címe "sed segítség", így az érezhető ki belőle, hogy az eszköz adott, nem választható.
"dátum(pl 2008.05.01. 12:23:22) szöveg szám szöveg szám ...."
"00:01 2008.04.24 ---> I4M SSM/Result/II_PREF <> Result/CP/Cl/REF ("85040"<>"483")."
Ezek nem igazán hasonlóak. Egy regexpes kérdésnél fontos a formátum, mintaadattal érdemes kezdeni már az elején.
Ezekből csak a 85040, 483 és 737 az érdekes, vagy az I4M-ből a "4" is?
Az awk scriptben elütés van. "alma"!="alam".
És ha már sed, akkor valami hasonló:
sed -re 's/[^ \t"]*[^0-9 \t"][^ \t"]*[ \t"]*//g' -e 's/"/ /g'
De awk-ban jobban követhető:
awk 'BEGIN { FS="\"" } { for (A=2 ; A<=NF; A=A+2) printf "%d ", $A; print "" }'
- A hozzászóláshoz be kell jelentkezni
nekem csak a betük kellenek, a számok nem. A dátum rész úgy alakul ahogy én szeretném, kettő között egy space szeparátor van. azután jöhet bármilyen szaparátor, majd a a betü és szám halmaz, amiből csak a betükre van szükségem.
Tehát amit szeretnék az első körben sed lett volna, de már bármi megteszi (ha mást nem írok kis c progit) hogy jobb oldali részből kitöröljem a számokat. Az a gond, hogy nagyon sokféle van, és egyértelmű feltétel (hogy "" között van pl) nincs rá.
- A hozzászóláshoz be kell jelentkezni
Ezt a megoldást alkottam rá:
awk -F\\t '{print substr($1,0,4)" "substr($2,0,10)" ---> "$4;}' | cut -d' ' -f1,2,3,6- | awk -F"--->" '{printf "%s-->",$1;text=$2;for (ssh=1;ssh<length(text)+1;ssh++){if ((substr(text,ssh,1)<"0") || (substr(text,ssh,1)>"9")) printf "%c",substr(text,ssh,1);};print "";}'
igaz köze nincs a sed-hez, de talán rossz irány volt
- A hozzászóláshoz be kell jelentkezni
Na kezd közelíteni, de még mindig nem pontos a specifikáció.
"A dátum rész úgy alakul ahogy én szeretném, kettő között egy space szeparátor van."
Akkor ezt az igényeknek megfelelően kell módosítani.
Most legyen: "^[^ \t]+ [^ \t]+"
"azután jöhet bármilyen szaparátor"
Azaz bármilyen karakter (csak egy), vagy tényleg akármi?
Akármilyen karakter: "."
"a betü és szám halmaz, amiből csak a betükre van szükségem."
Betűkre vagy szavakra? Mik a számok? Csak az egyes számjegyek vagy számként értelmezhető szavak? A szavakban szereplő számjegyekkel mi legyen?
Számjegyekre: "[0-9]"
Számként értelmezhető szavak: ""
A sor elején lévő két white space-szel szeparált szót követő karakter után jövő karakterhalmaz a számjegyek kivételével:
sed -re 's/^[^ \t]+ [^ \t]+.|[0-9]//g' <testfile˘
---> IM SSM/Result/II_PREF <> Result/CP/Cl/REF (""<>"").
---> IM In/CC/CP/T="" fix.
Sokkal jobb lenne, a két sor pattern alá megírnád a tervezett kimenetet.
- A hozzászóláshoz be kell jelentkezni
Ezekre elvleg ez is jó:
cat file | sed "s/[12][0-9][0-9][0-9]\...\...\. ..:..:.. /\2/g"
Nem éppen a legelegánsabb, de ez is működik...
Értelemszerűen a "." karakterek kicserélhetőek... :)
- A hozzászóláshoz be kell jelentkezni
"... de ez is működik..."
$ cat file | sed "s/[12][0-9][0-9][0-9]\...\...\. ..:..:.. /\2/g"
sed: -e expression #1, char 46: invalid reference \2 on `s' command's RHS
Ha a backreference-től eltekintünk, ez akkor is csak a dátumot és az időt törölné.
Egy előző hozzászólásban kaltsi már megadta a tényleges adatmintát, ez nem az volt.
- A hozzászóláshoz be kell jelentkezni
Köszi, hogy szóltál. :) \2 véletlenül ott maradt. (Nem kopipészt volt...)
- A hozzászóláshoz be kell jelentkezni
Most nézem a \2 nem kell... :S Bocsi!
- A hozzászóláshoz be kell jelentkezni