Orta büyüklükte (yaklaşık 10M-100M satır) sekmeyle ayrılmış sütun metin dosyalarıyla çalışmak için unix kabuğumda çok fazla grep awk sıralama kullanıyorum. Bu açıdan unix kabuğu benim e-tablom.
Ama büyük bir sorunum var, yani kimlik listesi verilen kayıtları seçmek.
table.csv
Biçime sahip dosya id\tfoo\tbar...
ve kimlik ids.csv
listesi içeren dosyaya sahip olmak için yalnızca table.csv
kimliğin bulunduğu kayıtları seçin ids.csv
.
bir çeşit /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids ama kabuklu, perl değil.
grep -F
Açıkçası kimlikleri değişken genişlikse yanlış pozitif üretir.
join
asla çözemediğim bir yardımcı program. Her şeyden önce, alfabetik sıralama gerektirir (dosyalarım genellikle sayısal olarak sıralanır), ancak o zaman bile yanlış siparişten şikayet etmeden ve bazı kayıtları atlamadan çalışamıyorum. Bu yüzden hoşuma gitmedi. id ^id\t
sayısı çok olduğunda grep -f, -s ile dosyaya karşı çok yavaştır.
awk
hantal.
Bunun için iyi çözümler var mı? Sekmeyle ayrılmış dosyalar için belirli bir araç var mı? Ekstra işlevsellik de memnuniyetle karşılanacaktır.
UPD: Düzeltildi sort
->join
awk
.
sort
sayısal, alfabetik ve diğer her türlü sıralama yapabilir. Bkz man sort
.
grep -f
buna değer daha fazla sorun gibi bu strateji sesleri koruyarak, çok yavaş - varyasyonlar olasılıkla aynı O (N * M) performans sorunları pençesine düşecek. Belki de zaman normalleştirilmiş bir SQL DB kullanmayı öğrenmek için daha iyi harcanan olurdu ...