Uso un sacco di grek awk sort nella mia shell unix per lavorare con file di testo di colonne separati da tab di medie dimensioni (circa 10M-100M). A questo proposito unix shell è il mio foglio di calcolo.
Ma ho un grosso problema, ovvero la selezione dei record con un elenco di ID.
Avendo table.csv
file con formato id\tfoo\tbar...
e ids.csv
file con elenco di ID, seleziona solo i record table.csv
con ID presente in ids.csv
.
tipo di /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids ma con shell, non perl.
grep -F
produce ovviamente falsi positivi se gli ID hanno una larghezza variabile.
join
è un'utilità che non avrei mai potuto capire. Prima di tutto, richiede un ordinamento alfabetico (i miei file sono in genere ordinati numericamente), ma anche in questo caso non riesco a farlo funzionare senza lamentarmi di un ordine errato e saltando alcuni record. Quindi non mi piace. grep -f contro il file con ^id\t
-s è molto lento quando il numero di ID è grande.
awk
è ingombrante.
Ci sono buone soluzioni per questo? Qualche strumento specifico per i file separati da tabulazione? Anche le funzionalità extra saranno le benvenute.
UPD: corretto sort
->join
awk
.
sort
può fare tutti i tipi di ordinamento, numerico, alfabetico e altri. Vedere man sort
.
grep -f
è troppo lento, mantenere questa strategia suona come più problemi di quanti ne valga la pena - le variazioni probabilmente cadranno in preda agli stessi problemi di prestazioni O (N * M). Forse il tuo tempo sarebbe meglio se impari a usare un SQL DB normalizzato ...