Bash jegyzet magamnak

Vezetéknév Keresztnév Email felépítésű CSV fájl oszlopokra darabolása bash-el:

echo "Vezetéknév;Keresztnév;Email" > lista.csv; cat data.csv | cut -f3-4 -d ';' | sed 's/"//g' | sed 's/ /;/g' | uniq >> lista.csv

Hozzászólások

Mélyebb elemzés nélkül, első ránézésre egyszerűsítve kicsit, de messze nem eléggé:

echo "Vezetéknév;Keresztnév;Email" > lista.csv; cut -f3-4 -d ';' data.csv | sed -e 's/"//g' -e 's/ /;/g' | uniq >> lista.csv

{0} ok boto
boto ?


echo "Vezetéknév;Keresztnév;Email" && lista.csv; cut -f3-4 -d ';' data.csv | sed -e 's/"//g;s/ /\;/g' | sort -u >> lista.csv

1) a sed-ben pontosvesszovel ossze lehet vonni utasitasokat, ekkor viszont a matchelt pontosvesszot vedeni kell
2) a uniq nem birkozik meg az alabbi szerkezettel:

  • alma
  • banan
  • alma
  • alma

Ugye itt az elvart mukodes a

  • alma
  • banan

lenne, ehelyett:

  • alma
  • banan
  • alma

Lesz.

--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Nem kerek a toretenet, hol lehetnek " -jelek amiket kiszedsz ?

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

A CSV formatum definicioja megengedi, hogy bizonyos cellakat idezojelekbe foglaljanak. Altalaban olyan cellak szoktak lenni ezek, melyekben szokoz, vesszo vagy pontosvesszo van, de nem kizaro ok az sem, ha nincs ilyen karakter a cellaban.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Jeee :))

Azert kerdeztem, erdetileg, mert, ha nem a full CSV "szabvany" kovetes a cel, hanem az itt elofordulo dolgok kezelese, akkor lehet lenne egy egyszerubb megoldasom.

Mivel latjuk, hogy banik az " jelekkel, valoszinuleg nem az a cel.

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Uhum, uhum, az ilyen miatt tudnám faszkorbáccsal azt kezelni, aki írta az előző árlista-konverterünket az ügyviteli rendszerünkhöz. Ugyan kitalálta, hogy legyen már CSV XLS helyett, mert azzal még tud PHP-ban dolgozni (árlistak jó része XLS, XLS, néhány XML és 1-2 CSV, TSV), csak épp ilyen apróságokat nem vett figyelembe, hogy hogyan is néz ki egy CSV. (Az egyéb borzalmakat, amit a karakterkódolással* és az XML** feldolgozással elkövetett borzalmakat, azokat ne is említsük.

Az ilyen és ehhez hasonló problémák miatt lett kivágva az egész a picsába és írtam helyette .NET-ben egy Excel Interopot használó programot. Na, azóta nincs gond az árlisták betöltésével. (Arról nem is beszélve, hogy a saleses kollégák helyből megúsznak egy felesleges konvertálási műveletet az Excellel, szimplán a nyers fájl mehet befele.)

* iconv mint olyan nem ismerete, excel által kiadott CSV kódolásának totális ignorálása, mindent str_replace-al feldolgozva, aztán "miért ilyen hülye a partner, hogy egy hangjegy karaktert rak a terméknévbe?!" felkiáltások és meglepődések.
** feldolgozás regexppel (facepalm), UNICODE kódolású XML "feldolgozása" str_replace-al, stb.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Arra ügyelj, hogy a data.csv fájlban ne legyen 2 keresztnevű ember, mert a

sed 's/ /;/g'

hibás működést fog eredményezni. Például "Kiss János Attila" esetén gond lehet a kimenettel.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.

cat lista.csv | awk 'BEGIN {FS=";"}{print $1}' >elso_oszlop.txt
cat lista.csv | awk 'BEGIN {FS=";"}{print $2}' >masodik_oszlop.txt
cat lista.csv | awk 'BEGIN {FS=";"}{print $3}' >harmadik_oszlop.txt

Ha a mezőelválasztó a
;
akkor nincs gond a space-ekkel és a 3, esetleg 4 szavas neveknél sem. Csak ; jel ne legyen a szöveg belsejében, hiszen az a mezőelválasztó a csv-ben

De nagyon gonosz vagy! 3 kismacskat oltel meg ezzel a koddal.


awk 'BEGIN { FS = ";" } { print $1 >> "elso_oszlop.txt" ; print $2 >> "masodik_oszlop.txt"; print $3 >> "harmadik_oszlop.txt" }' lista.csv

Forras.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

sot:


#!/usr/bin/awk -f

# splitter.awk
#
# Splits a 3-col CSV file into files each column goes into a separated file

BEGIN {
  FS = ";"
}
{
  print $1 >> "elso_oszlop.txt"
  print $2 >> "masodik_oszlop.txt"
  print $3 >> "harmadik_oszlop.txt"
}

es akkor: chmod +x splitter.awk && ./splitter.awk lista.csv

Vigyazz, en ilyenekben nagyon el tudok am szallni, ha felpiszkalnak...
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Mi a mennydorgos francnak olyan? Az AWK alapvetoen megiscsak szovegbuherator, nem scriptnyelv. Letezo dolog egyebkent, de akkor pont a szepseget oljuk meg a dolognak. Az awk ugyanis defaultbol a STDIN-rol olvas, ha nincs megadva neki forrasfajl. Es ez a legtobb esetben jo, ebben az esetben kulonosen. Mert itt akar meg curl-bol is be lehet csovezni a csv-t.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Mivel az eredeti feladat szerint a CSV fájlban szóköz az elválasztó karakter, így ez nem járható út.

Megoldási javaslat a több keresztneves problémára: Az első mező ($1) a vezetéknév, az utolsó mező ($NF) az email cím, a többi pedig keresztnév.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.

„Vezetéknév Keresztnév Email felépítésű CSV fájl oszlopokra darabolása bash-el:”

Szerintem itt szerepel. Ne keverd össze azzal, hogy a

echo "Vezetéknév;Keresztnév;Email" > lista.csv;

utasítással kiír egy fejléc sort a kimeneti fájlba.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.

Egyébként jó látni, ahogy szenvedtek a shellel táblázatkezelés témakörében táblázatkezelő eszközök nélkül. ;)

Ilyenkor eszembe jut a bash vs PS-es topicból a "de a shellben kreatívabb lehetsz" beszólás. Az más kérdés, hogy a tényleges feladat megoldása helyett ahhoz kell kreatívkodni, hogy össze lehessen tákolni valahogy az adott feladatot.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Hmm.
hogy is mndjam...

Amikor postai etikettet akarsz egy hatalmas adatbázisból nyomtatni (kb. 14000 címzett) oly módn, hogy bizonyos személyeket nem kell bántani, de legyen a címben minden budapesti kerület római szám alsó-felső vízszintes jellel, de különben századpontossággal pozicionálva az etiketthez, szóval táblázatkezelőben befonod a hajad egy ilyentől.
Bashban Latex segítségével meg még kávézol is.
(Csináltam már ilyet pdf kimenettel de nem becsülték meg, így abbahagytam, utólag felvettek a feladatra 2 embert klikkelgetni valami micro$oftos szörnyben)

..szóval mi is a szenvedés?