Sziasztok!
Van egy csomó .csv fájlom egy mappában.
Szeretném azt megoldani, hogy a fájlokban található szöveges rész legvégén található enter-t töröljem.
A sorok végén is van enter, de azoknak meg kellene maradjon, csak a legutolsó entert kell törölni.
sed-el próbálkoztam, de nem tudok rájönni, hogyan csinálja.
Ha valakinek van ötlete, kérem segítsen.
köszönöm:
Zsolt
- 2021 megtekintés
Hozzászólások
for f in `ls -1 *.csv`
do
perl -i -pe "chomp if eof" $f
done
--
A gyors gondolat többet ér, mint a gyors mozdulat.
- A hozzászóláshoz be kell jelentkezni
Ez tetszik! Főleg a perl one liner része.
Csaba
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen, így ez nagyon jó,és így már fel tudom dolgozni őket.
- A hozzászóláshoz be kell jelentkezni
"… szöveges rész legvégén található enter-t töröljem.
A sorok végén is van enter, de azoknak meg kellene maradjon, …"
Általánosságban: Csak egyféle enter van (egy adott platformon). Tehát ha a csv fájlodban vannak olyan „mezők”, amelyek önmaguk is tartalmaznak entert, akkor az az enter egyúttal a sor végét is fogja jelenteni a csv fájl feldolgozása során.
Speciális eset: Előfordulhat azonban, hogy ezek az entert is tartalmazó mezők bizonyos esetekben, a környezetük alapján felismerhetőek. Ekkor esetleg valamilyen módon felismerhetőek. Ennek eldöntéséhez azonban linkelned kellene egy ilyen fájl, vagy fájl részletet. Mert anélkül biztosan nem oldható meg a problémád.
- A hozzászóláshoz be kell jelentkezni
jahogy, lehet nem az állományok végén lévő utolsó üres sorra gondolt? o.O
--
A gyors gondolat többet ér, mint a gyors mozdulat.
- A hozzászóláshoz be kell jelentkezni
Az állomány végén lévő új sorra gondoltam, ez így szuper köszi.
- A hozzászóláshoz be kell jelentkezni
Kézzel futtatva megy szépen, próbálom időzítve futtatni, de úgy nem értelmezi a perl részt.
Ha ezt beteszem, akkor pedig a második sorra dob hibát(for ciklust nem érti): #!/usr/bin/perl
- A hozzászóláshoz be kell jelentkezni
#!/bin/bash
Ez egy bash script. ;)
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ez volt amit először beírtam, és akkor se futott a perl rész.
- A hozzászóláshoz be kell jelentkezni
Lehet, nincs a PATH környezeti változóban a perl elérési útja. Próbáld így hívni:
/usr/bin/perl paraméterek
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A perl interpretert full path-szal írd be a scriptbe, ki tudja, a cron milyen $PATH változót kap a futáskor...
Alighanem: /usr/bin/perl
Szerintem...
Csaba
- A hozzászóláshoz be kell jelentkezni
Megvan a megoldás.
A szkript elején: cd /home/csv
Így már cronból is megtalálja.
Köszönöm a segítséget mindenkinek, a szkriptem ilyen lett:
#!/bin/bash
cd /home/csv/
for f in `ls -1 *.csv`
do
perl -i -pe "chomp if eof" $f
done
mv /home/csv/*.csv /home/csvok/
- A hozzászóláshoz be kell jelentkezni
Jaj, tényleg kiverte a szemünket az az ls -1 *.csv
, amely ugye az aktuális alkönyvtárra vonatkozik. :) Ahhoz képest elsiklottunk fölötte... :(
tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Azért elég durva ilyen kis feladatra perl-t használni.
- A hozzászóláshoz be kell jelentkezni
Mondj egy egyerűbbet akkor, kérlek.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Próbáltam azt is, de nem sikerült szkriptben automatizálnom.
Lekopogom, ez most szépen dolgozik.
- A hozzászóláshoz be kell jelentkezni
Hmmm. Erre nem gondoltam. Magamból indultam ki. A te változatod esetén azt kérdeztem volna, hogy hogyan törölhetem ki az állományok végén található üres sort. :-) De ettől még nem kizárt, hogy neked volt igazad, és én (és a kérdező) bonyolítottam túl.
Kiegészítés: én tévedtem :-(
- A hozzászóláshoz be kell jelentkezni
Akkor lehet félreérthetően kérdeztem, de lényeg, hogy megvan a szuper megoldás hozzá.
Köszönöm.
- A hozzászóláshoz be kell jelentkezni
Azért legyen itt egy sed megfejtés is az üres sor törlésére: :-)
sed -e '/^$/d'
Ez azonban nem csak a fájl végi üres sort törli, hanem az összes üres sort.
- A hozzászóláshoz be kell jelentkezni
dollárt az elejire:
sed '${/^$/d}'
- A hozzászóláshoz be kell jelentkezni
Igaz.
Akkor egy változat a scriptre:
#!/bin/bash
AHONNAN="$HOME/csv"
AHOVA="$HOME/newcsv"
cd "$AHONNAN"
for i in *.csv ; do
sed '${/^$/d}' "$i" > "$AHOVA/$i"
rm "$i"
done
- A hozzászóláshoz be kell jelentkezni
Ez a fájlokat átteszi, de a fájl végi üres sor megmaradt.
- A hozzászóláshoz be kell jelentkezni
# perl chomp nelkul
perl -i -ne 'my $s;$/=undef;$s=<>;$s=~s/[\n\r]+$//gsx;print $s' IZE_BIGYO.csv
- A hozzászóláshoz be kell jelentkezni
A fájlok végén csak egy üres sor van, vagy több is lehet?
- A hozzászóláshoz be kell jelentkezni
Csak 1 van.
- A hozzászóláshoz be kell jelentkezni
Passz. Akkor nem tudom mi lehet a hiba oka. Most csináltam egy tesztet 2 fájllal, és nálam törölte az utolsó sort, ha az üres volt.
- A hozzászóláshoz be kell jelentkezni
nos, ha javasolhatnám gnu sed esetén:
for lofasz in *.csv ; do
sed -i '${/^$/d}' "$lofasz"
done
IMHO "ed" -es megoldásokat javaslom akkor, ha gnu sed nincs, vagy nem nagyon akarod, hogy a csv -k könyvtárába szemeteljen! Az kicsit más megoldást igényel.
- A hozzászóláshoz be kell jelentkezni
sed '$d' < asd.csv
- A hozzászóláshoz be kell jelentkezni
Ez nem jó, mert a teljes utolsó sort kitörli, nem csak az újsort az utolsó sor végéről.
- A hozzászóláshoz be kell jelentkezni
Ja értem. Hátakkormeg head -c -1 asd.csv
- A hozzászóláshoz be kell jelentkezni
Kivéve, ha van a bemeneti fájljai között olyan, amiben nincs utolsó sor végén "új sor".
Ez pedig nagyon könnyen előáll, ha valami gubanc miatt a head -c -1 parancsot többször futtatja le ugyanazokon a fájlokon. (Pl tesztelget.) Akkor már a fenti sed-es megoldás jobb.
- A hozzászóláshoz be kell jelentkezni
Ennyi erővel bármire lehet bármit mondani.
- A hozzászóláshoz be kell jelentkezni
Bármi :-)
Magam részéről a Linux-kezdőben nem adnék olyan tanácsot, amit egy kezdő rosszul használva elveszítheti az adatait. De igazad van.
Azért meg külön kösz, hogy felhívtad a head -c kapcsolójára a figyelmemet, még hasznos lehet.
Csaba
- A hozzászóláshoz be kell jelentkezni
Csak azért, hogy awk is legyen a megoldások között...
Az alábbi parancs leveszi az uccsó sort, de csak akkor ha az üres:
awk -v eof=$(wc -l < file.csv) '{if ( eof != NR || $0 !~ /^$/ ) { print $0; } }' file.csv
Egyébként a perl megoldás a legszebb ;)
---
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
A szinesség kedvéért egy még hatékonyabb módszer:
for i in $(find . -type f -name \*.csv); do
egrep -v "^$" $i > $i.tmp && mv $i.tmp $i
rm -f $i.tmp
done
- A hozzászóláshoz be kell jelentkezni