Używam dużo grep awk sort w mojej powłoce uniksowej do pracy ze średnimi (około 10M-100M linii) plikami tekstowymi kolumn oddzielonymi tabulatorami. Pod tym względem powłoka unix jest moim arkuszem kalkulacyjnym.
Ale mam jeden ogromny problem, a mianowicie wybór rekordów na podstawie listy identyfikatorów.
Mając table.csv
plik w formacie id\tfoo\tbar...
i ids.csv
plik z listą identyfikatorów, wybieraj tylko rekordy table.csv
z obecnym identyfikatorem ids.csv
.
rodzaj /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids ale z powłoką, nie perl.
grep -F
oczywiście produkuje fałszywie dodatnie, jeśli identyfikatory mają zmienną szerokość.
join
to narzędzie, którego nigdy nie zrozumiałem. Przede wszystkim wymaga sortowania alfabetycznego (moje pliki są zwykle sortowane numerycznie), ale nawet wtedy nie mogę uruchomić go bez narzekań na niewłaściwą kolejność i pomijanie niektórych rekordów. Więc mi się nie podoba. grep -f przeciwko plikowi z ^id\t
-s jest bardzo wolny, gdy liczba id jest duża.
awk
jest uciążliwy.
Czy są na to jakieś dobre rozwiązania? Jakieś specjalne narzędzia do plików rozdzielanych tabulatorami? Dodatkowa funkcjonalność będzie również mile widziana.
UPD: Poprawione sort
->join
awk
.
sort
potrafi wykonywać wszelkiego rodzaju sortowania, numeryczne, alfabetyczne i inne. Zobaczyć man sort
.
grep -f
jest zbyt wolny, utrzymanie tej strategii wydaje się większym kłopotem niż jest to warte - odmiany prawdopodobnie padną ofiarą tych samych problemów z wydajnością O (N * M). Może lepiej poświęcić swój czas na naukę korzystania ze znormalizowanej bazy danych SQL ...