Posiadające plik o następującej treści:
1111,2222,3333,4444
aaaa,bbbb,cccc,dddd
Próbuję uzyskać plik równy oryginałowi, ale nie ma n-tej kolumny, np. Dla n = 2 (lub może to być 3)
1111,2222,4444
aaaa,bbbb,dddd
lub, dla n = 0 (lub może to być 1)
2222,3333,4444
bbbb,cccc,dddd
Rzeczywistym plikiem może być gigabajt długości kilkudziesięciu tysięcy kolumn.
Jak zawsze w takich przypadkach, podejrzewam, że magicy z linii poleceń mogą zaoferować eleganckie rozwiązanie ... :-)
W moim prawdziwym przypadku muszę upuścić 2 pierwsze kolumny, co można zrobić, upuszczając pierwszą kolumnę dwa razy w sekwencji, ale przypuszczam, że bardziej interesujące byłoby uogólnienie nieco.
text-processing
Ivan
źródło
źródło
,
? (Tj.,
Służy tylko jako separator pól).,
i nigdy nie występuje wewnątrz pola.Odpowiedzi:
Uważam, że jest to specyficzne dla wycięcia z podstawowych GNU:
Zazwyczaj określasz pola, które chcesz, poprzez -f, ale dodając - dopełnij, naturalnie odwracasz znaczenie. Z „man cut”:
Jedno zastrzeżenie: jeśli którakolwiek z kolumn zawiera przecinek, zostanie odcięta, ponieważ wycięcie nie jest parserem CSV w taki sam sposób, jak arkusz kalkulacyjny. Wiele parserów ma różne pomysły na temat obsługi przecinków w CSV. W prostym przypadku CSV, w wierszu poleceń cięcie jest wciąż właściwą drogą.
źródło
cut
, ponieważ nie jest parserem CSV. Jeśli pole CSV ma w swojej wartości separator pól, jest ono zawinięte w cudzysłów. Btw, na tematcut
,-f
odbywa zakresy pól.cut -f, -d3-
wypisze trzecie pole na, usuwając pierwsze dwa.cut -d, -f3-
Jeśli dane są po prostu wykonane z kolumn oddzielonych przecinkami:
Możesz także użyć awk, ale jest to trochę niewygodne, ponieważ usuwanie pola jest łatwe, ale usuwanie separatora zajmuje trochę pracy. Jeśli nie masz pustego pola, nie jest tak źle:
Jeśli masz rzeczywisty plik CSV, w którym przecinki mogą pojawiać się w polach, jeśli są odpowiednio cytowane, potrzebujesz prawdziwej biblioteki CSV .
źródło