Sziasztok!
Ott akadtam meg, hogy van egy fájlom, amiből el kellene távolítanom egy bizonyos oszlopot. A fájlban ezeknek az oszlopoknak az elhelyezkedése a sor elejétől különböző, ellenben a végéről indulva ugyanaz.
Ki merre indulna el?
pl.:
1234, xdkfj, KIVÁGNI, 1, asdfg,
1234, xdkfj, qwert, KIVÁGNI, 1, asdfg,
qwert, KIVÁGNI, 1, asdfg,
Előre is köszönöm!
- 8024 megtekintés
Hozzászólások
Ha mindig KIVÁGNI szerepel benne, akkor sed. :)
Ha más is szerepelhet, feltétel szerint, akkor awk.
- A hozzászóláshoz be kell jelentkezni
Igen, nem volt egyértelmű. A KIVÁGNI értéke mindig más
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
cat ./teszt.txt | while read LINE; do LINE=( $LINE ); LINE[$((${#LINE[@]}-3))]=; echo ${LINE[@]}; done
- A hozzászóláshoz be kell jelentkezni
Ez valamiért nem működik (persze a beírt példára ok, csak az adott fájlon nem)
Bemásolok egy sort:
Teszt,2223333,Teszt 24 Sor 500 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZT_KELLENE_KIVÁGNI,19490,19490,1,1,darab,érték szám
Nem tudom, hogyan fog megjelenni, de ez egy sor. Az "EZT_KELLENE_KIVÁGNI" és a "981234MBG.dat" között van szóköz
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Akkor most 1 oszlopot kell eltávolítani, vagy kettőt? A szeparátor space vagy vessző? A sor végén van vessző, mint az eredeti példában, vagy nincs, mint a ebben?
- A hozzászóláshoz be kell jelentkezni
Nekem csak az elsőt kellene eltávolítani(bocs kevés vagy sok volt a kávé :) ), tulajdonképpen ez egy duplikátum és az első nem kell:
Teszt,2223333,Teszt 24 Sor 500 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Feltéve hogy a vessző a szeparátor:
cat file |sed -r 's/^(.*),[^,]+,(([^,]+,){6})([^,]+)$/\1,\2\4/g'
a {6}-ot kell változtatni, ha másik oszlopot akarsz kivágni. Ez hátulról számolt oszlop - 2.
- A hozzászóláshoz be kell jelentkezni
most vagy a delimitert változtatod, (szóközről vesszőre cseréled)
vagy minden vesszőt lecserélsz ", " párosra:)
majd a cserélni kívánt oszlopban lévő szöveget manipulálod.
- A hozzászóláshoz be kell jelentkezni
mondjuk sokat segítene a megfejtésben, ha idemásolnál legalább 2 sort és megadnád azt is, hogy mi az elvárt eredmény. Lehet én vagyok fáradt, de nekem még nem világos.
http://www.qualysoft.hu/hu/dms/qs-portal/presentation/M-2010szakmainap/…
A 2. diára kezd emlékeztetni ez a szál.
- A hozzászóláshoz be kell jelentkezni
#! /bin/bash
COL=8
cat ./teszt.txt | while read LINE
do
OFS="$IFS"
IFS=","
ROW=( $LINE )
IFS="$OFS"
UB=${#ROW[@]}
COUNT=0
while ((COUNT<UB))
do
if ((COUNT==${#ROW[@]}-COL))
# if echo "${ROW[$COUNT]}" | grep -q ".dat$"
then
ROW[$COUNT]="$(echo "${ROW[$COUNT]}" | sed -n 's/^.* \([A-Za-z0-9]\+\.dat\)$/\1/p')"
fi
echo -n "${ROW[$COUNT]}"
((COUNT < UB-1)) && echo -n "," || echo -e "\n"
((COUNT++))
done
done
mostmár rendesen össze van gányolva:))
de az a file is amiből dolgozni kell!
- A hozzászóláshoz be kell jelentkezni
Azt tudom -sajnos- :(
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
cut -d"," -f1-3,5-6 < bemenet > kimenet
- A hozzászóláshoz be kell jelentkezni
A cut nem jó, mert az oszlopok száma több helyen is változik és kb 4800 sorról van szó.
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
rev | cut -d , -f -2,4- | rev
- A hozzászóláshoz be kell jelentkezni
rev
kár volt ilyen hamar lelőnöd, szépen alakult a topic (szerk: bár a megoldás nem szegte kedvét mindenkinek, ahogy látom)
- A hozzászóláshoz be kell jelentkezni
pláne hogy a megoldás hibás.
Hint: "hátulról a harmadik szóköz előtti részt kellene az előtte lévő vesszőig törölnöm"
- A hozzászóláshoz be kell jelentkezni
Talán feltűnt hozzászólásomban az idézet, mely szerint a "rev"-re reagáltam. Ui. az az, ami említést érdemel.
Hint: [...]
Ugyan, az OP adott mintaállományt a nyitóban:
1234, xdkfj, KIVÁGNI, 1, asdfg,
1234, xdkfj, qwert, KIVÁGNI, 1, asdfg,
qwert, KIVÁGNI, 1, asdfg,
rev | cut -f -3,5- -d , | rev
kimenete
1234, xdkfj, 1, asdfg,
1234, xdkfj, qwert, 1, asdfg,
qwert, 1, asdfg,
"Fero" egyszerűen elszámolta a vesszőket.
Ha nem ez a megoldandó probléma, akkor megint ott vagyunk, hogy kérdezni tudni kell. (A topiknyitót lehet módosítani.)
- A hozzászóláshoz be kell jelentkezni
Hátulról a harmadik oszlopot kell kivágni?
Ha igen, akkor szerintem:
sed "s@\(.*\),[^,]*,\([^,]*,[^,]*,[^,]*\)\$@\1,\2@"
- A hozzászóláshoz be kell jelentkezni
Bár a sed-del jó ideje barátkozom, de itt pl. mit is változtatsz ha a 4. vagy 5. oszlopot akarod törölni?
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Nem a {2} vagy hasonlót használtam, hanem kétszerháromszor kiírtam :) Amit változtatsz: vagy bevezeted a kapcsos zárójelet, vagy pedig annyiszor írod ki a "farok-részt", ahányszor kell.
- A hozzászóláshoz be kell jelentkezni
Kéne pár sor valódi bemenet , és hogy mit is szeretnél, de pl:
awk -v x=3 '{ for ( i=1 ; i<= NF; i++ ) { if ( i != NF - x + 1 ) printf( "%s%s", $i, FS ) ;} print RS }'
Ez a hátulról a 3. mezőt takarítja ki, és az x változtatásával szabályozható, ha meg nem sima szóköz/tabulátor a mezőelválasztó, akkor egy -F 'akarmi' opcióval az is változttható.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, tesztelem!
Akkor a több sor:
Teszt,2223343,Teszt 24 Sor 510 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,valami,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
Teszt,2223333,Teszt 24 Sor 500 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
Teszt,2223343,Teszt 24 Sor 510 Sor 2.2 1111mfg tesztadat (ide valami),sorozat,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
Teszt,2223333,Teszt 24 Sor 500 Sor 2.2 1111mfg tesztadat (ide valami),érték,adat,1234: sorozatszám12,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Ez már alakul, a gond az, hogy amikor megadom neki, akkor ennél a sornál:
Teszt,2223333,Teszt 24 Sor 500 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,1,EZT_KELLENE_KIVÁGNI 981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
ezt a részt vágja ki:
,sorozatszám12,1,EZT_KELLENE_KIVÁGNI
ehelyett:
EZT_KELLENE_KIVÁGNI
Ami biztos (most, hogy jobban nézem én is - és ezért elnézést!), hogy hátulról a harmadik szóköz előtti részt kellene az előtte lévő vesszőig törölnöm
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
-F,
- A hozzászóláshoz be kell jelentkezni
Ezzel az ötödik vesszőt előtti részt vágja ki, viszont az nem jó. A vesszők száma a végéről is változik a szóköz a biztos.
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Ácsi. MI a mezőelválasztó? Szóköz vagy vessző? Ha mindkettő lehet, akkor csak gányolás marad - vagy a bemenet értelmes formában történő előállítása (egységes mezőelválasztó).
Próbálom megérteni... A végétől az x. szóköz előtti részt kell kivágni az azt megelőző vesszőig?
- A hozzászóláshoz be kell jelentkezni
Szerintem ott van megfogalmazva a feladat: "hátulról a harmadik szóköz előtti részt kellene az előtte lévő vesszőig törölnöm"
- A hozzászóláshoz be kell jelentkezni
Igen
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Akkor erre jó, amit már írtam:
sed -r 's/^(.*),[^ ]+ (([^ ]+ ){2})([^ ]+)$/\1\2\4/g'
- A hozzászóláshoz be kell jelentkezni
Hm...nálam nem, de lehet már nekem jojózik a szemem... :D
sed -r 's/^(.*),[^ ]+ (([^ ]+ ){2})([^ ]+)$/\1\2\4/g' proba.txt
Teszt,2223343,Teszt 24 Sor 510 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,valami,1,EZT_KELLENE_KIVÁGNI
981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Nálam ezt adja:
Teszt,2223343,Teszt 24 Sor 510 Sor 2.2 1111mfg tesztadat (ide valami),sorozatszám12,valami,1981234MBG.dat, EZ_MARADHAT,19490,19490,1,1,darab,érték szám
Most az eredeti fájlban
- vagy a legvégén van még valami szemét (mondjuk egy space), ami miatt nincs egyezés,
- vagy DOS-os sorvég van
- vagy C a LANG beállításod valami hu_HU.UTF-8 (esetleg en_US.UTF-8) helyett
- vagy a fentiek kombinációja :)
- A hozzászóláshoz be kell jelentkezni
Bocs, kis módosítás, mert így egy "," lemaradt (az 1 meg a 981234MBG.dat között):
sed -r 's/^(.*),[^ ^,]+ (([^ ]+ ){2})([^ ]+)$/\1,\2\4/g'
De a fentiek továbbra is állnak, ha ugyan azt a sort kapod vissza.
- A hozzászóláshoz be kell jelentkezni
Köszi, ez működik, csak preparálnom kellett a végét sed-del még az üres karakterek miatt.
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
Ezzel kellett volna kezdeni a hsz.-t, a fene olvassa végig :-D
- A hozzászóláshoz be kell jelentkezni
Bocsi! :D Nekem is csak így menet közben kristályosodott ki, mert nem ez volt az egyetlen elképzelésem...
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
sed -r 's/^(.*),[^ ]+ (([^ ]+ ){2})([^ ]+)$/\1\2\4/g'
- A hozzászóláshoz be kell jelentkezni
awk ' BEGIN { NEMKELL=2; }
{ $(NF-NEMKELL)="";
print;
}'
- A hozzászóláshoz be kell jelentkezni
Én is valami ilyesmin gondolkodtam (bár én delete-tel), de két bajom van:
- az index el van eggyel csúszva (ez ugye hátulról a harmadikat törli, míg első ránézésre hihetnénk, hogy a másodikat)
- illetve marad benne egy fölösleges FS
- A hozzászóláshoz be kell jelentkezni
Az első szerintem nem probléma, de ha igen, akkor NF+1-NEMKELL, és tényleg meg van oldva :)
A második jó kérdés - itt "," a szeparátor, tehát a csúnyán kívül probléma is, erre egy szintén ronda, de gyors megoldás az awk kimenetét átzavarni egy
sed 's/,,/,/'
parancson. Mivel a szeparátor a vessző, így az egész:
awk -F, ' BEGIN { OFS=",";
NEMKELL=3;
}
{ $(NF+1-NEMKELL)="";
print;
} ' |
sed 's/,,/,/'
- A hozzászóláshoz be kell jelentkezni
Nem látom minek az OFS beállítása, ha egyszr $0-t iratod ki :-)
- A hozzászóláshoz be kell jelentkezni
~$ echo "a,b,c,d,e,f,g,h" | awk -F, 'BEGIN {OFS=",";} {$(NF-2)=""; print }' | sed 's/,,/,/'
a,b,c,d,e,g,h
~$ echo "a,b,c,d,e,f,g,h" | awk -F, ' {$(NF-2)=""; print }' | sed 's/,,/,/'
a b c d e g h
~$ awk --version
GNU Awk 3.1.8
Nem mindegy ugyanis...
- A hozzászóláshoz be kell jelentkezni
azannya (most megnéztem gawk/mawk/nawk-the-one-true-awk mindegyikével, kénytelen vagyok újra tanulni az awk-t)
De én biztos ezt írnám inkább:
BEGIN { OFS=FS;}
- A hozzászóláshoz be kell jelentkezni
Végre valami olyat tudtam mutatni neked, amit már elfelejtettél :-D Az OFS=FS megoldásra meg bőszen bólogatok.
- A hozzászóláshoz be kell jelentkezni
törölve
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
ha grafikus felület ven/kell. ms excel vagy libre office ott van ilyen sorokból oszlopot és meghatározhatod, hogy mi legyen az elválasztó.
- A hozzászóláshoz be kell jelentkezni
Azt elég rumlis automatizálni :) Azért köszi a tippet!
üdv: pomm
A 852-es kídlap telepötúsa sikeresen befejezádétt
- A hozzászóláshoz be kell jelentkezni
ja, azt nem olvastam, hogy automatizálni szeretnéd :)
szerk.: most megnéztem és azt írod, hogy egy fájlod van, akkor nem olvastam félre.
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
for s in open(sys.argv[1], "r"):
----m = s.split(',')
----print ','.join(m[0:-4]) + ',' + ','.join(m[-3:]),
A '----' jelet cseréld szóközre. Az argumentum a bemenő fájl neve.
- A hozzászóláshoz be kell jelentkezni
+1 már csak azért, mert Python. :)
- A hozzászóláshoz be kell jelentkezni
Nyisd meg LibreOffice-szal, vesszővel határozd meg az oszlopok tagoltságát, távolítsd el a fölösleges oszlopot, ments el csv-ben, a tabulátotokat getidben alakítsd át vesszőkké.
- A hozzászóláshoz be kell jelentkezni
Automatika...
Engem viszont egy karakterhármas ragadott magával... Egész pontosan az mfg hármas... Csak nem valami progress alapú gányolás van nálad?
- A hozzászóláshoz be kell jelentkezni