sed segítség kérés

Fórumok

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

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.

"… 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.

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 :-(

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.

Csaba

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 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