Posiadanie pliku CSV takiego:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
i szukam wyników takich jak:
HEADER
first, column|second "some random quotes" column|third ol' column
innymi słowy, usuwając „FOOTER”, cytaty na początku, na końcu i wokół |
Do tej pory ten kod działa:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Jak widzisz problem polega na tym, że tworzy 4 dodatkowe pliki.
Oto inne rozwiązanie, którego celem jest nie tworzenie dodatkowych plików i robienie tego samego w jednym skrypcie. To nie działa zbyt dobrze.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
nie będzie działać z tym, tylko z uproszczonej csv. Użyj języka programowania z biblioteką, która może obsługiwać prawdziwe pliki CSV (Python / Perl / Ruby).Odpowiedzi:
Po pierwsze, jak pokazał Michael, możesz po prostu połączyć je wszystkie w jedno polecenie:
Myślę, że niektóre
sed
implementacje nie mogą sobie z tym poradzić i mogą wymagać:To powiedziawszy, wygląda na to, że twoje pola są zdefiniowane przez
|
i chcesz po prostu usunąć"
całe pole, pozostawiając te, które są w polu. W takim przypadku możesz wykonać:Lub z GNU
sed
:Możesz także użyć Perla:
źródło
Działa to również:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Przykład:
ładna wersja
źródło
FOOTER
, usunie poszukiwane dane.