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.csvplik w formacie id\tfoo\tbar...i ids.csvplik z listą identyfikatorów, wybieraj tylko rekordy table.csvz 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 -Foczywiście produkuje fałszywie dodatnie, jeśli identyfikatory mają zmienną szerokość.
jointo 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.
awkjest 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.
sortpotrafi wykonywać wszelkiego rodzaju sortowania, numeryczne, alfabetyczne i inne. Zobaczyć man sort.
grep -fjest 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 ...