Muszę posortować kolumny bardzo dużego zestawu danych (1000 wierszy i 700000 kolumn). Na przykład moje kolumny są losowo ułożone w następujący sposób: col1 col4 col3 col2, i muszę to posortować.
Próbowałem kilka poleceń, ale bez powodzenia.
przykład:
ID M2 M5 M8 M1 M3 M9 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
W tym przykładzie kropki oznaczają, że mam dużo kolumn i linii. Ponownie muszę posortować kolumny, aby wyglądały następująco:
ID M1 M2 M3 M4 M5 M6 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
Dziękuję Ci
text-processing
awk
LLVerardo
źródło
źródło
Odpowiedzi:
Z GNU
datamash
i GNUsort
:Działa to dobrze w przypadku „stosunkowo małych” danych. Może, ale nie musi działać z twoim plikiem.
Edycja: Poniższe rozwiązania bez transpozycji powinny mniej obciążać zasoby.
źródło
datamash
np.rs -T < file_in.csv | sort | rs -T -C' '
(rs
Powinno być dostępne jako pakiet w systemach opartych na Debianie)rs
(„przekształć tablicę danych”) jest dostępny w systemach podstawowych niektórych BSD.M
występującej na początku, przy użyciu dobrze znanegoSchwartzian maneuver
. To daje nam uporządkowane indeksy, dzięki czemu kolumny wychodzą w porządku numerycznym (M1, M2, M3, ...)@I
aby zmienić rozmieszczenie@F
elementów.-p
opcja Perla włącza autodruk$_
zawartości,-l
dodajenewline
.źródło
Korzystanie z modułu perla Sort :: Naturalnie
dane wejściowe
wynik
źródło
Jeśli masz zainstalowane
rs
narzędzie , możesz to zrobić:Lub wszystko w jednej linii:
rs
transponuje dane wejściowe (z polami o odstępach spacji)sed
czyta pierwszy wiersz, wysyła go, a następnie kończy pracę, pozostawiając resztę potokurs
nietkniętą.stdbuf
jest wymagane, aby upewnić się, żesed
tylko czyta do pierwszej nowej linii, a nie dalej, poprzez wyłączenie buforowania danych wejściowychsort
s pozostałe liniers
transponuje wynikowy strumień z powrotem do oryginalnego formatu.rs
jest instalowany domyślnie na MacOS. W systemach Linux może być konieczne jego zainstalowanie - npZastrzeżenie:
stdbuf
isort
s-V
są specyficzne dla GNU, więc nie będą działać na niezmodyfikowanym MacOS.źródło
Jeśli masz GNU
awk
, możesz spróbować:źródło
W Pythonie:
źródło
Nie wiem, czy uważałeś to za dobrą odpowiedź, ale ...
Dlaczego nie używasz bazy danych do rozwiązania tego problemu? możesz zaimportować zestaw danych jako tabelę tymczasową, a następnie wykonać
Możesz użyć innych filtrów lub transformacji, jeśli potrzebujesz. Następnie możesz sformatować dane wyjściowe według potrzeb.
Wszystkie te zadania można zaprogramować jako skrypt bash i łączenie danych wyjściowych za pomocą potoków.
Czasami używano polecenia „pv”, aby zobaczyć postęp wyjściowy między poleceniami.
Aby zaimportować zestaw danych, możesz zaprogramować ETL za pomocą integracji danych Pentaho.
źródło
Może to też może ci pomóc.
Dawny:
źródło