Я використовую багато сорту grep awk у своїй оболонці unix для роботи із середніми розмірами (близько 10М-100М рядків) текстовими файлами стовпців, розділеними вкладками. У цьому відношенні оболонка unix - це моя таблиця.
Але у мене є одна величезна проблема - це вибір записів із переліком ідентифікаторів.
Маючи table.csvфайл із форматом id\tfoo\tbar...та ids.csvфайл із переліком ідентифікаторів, вибирайте лише записи table.csvіз наявного в ньому id ids.csv.
вид /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids, але з оболонкою, а не perl.
grep -Fочевидно, створює помилкові позитиви, якщо ідентифікатори змінної ширини.
joinце утиліта, яку я ніколи не міг зрозуміти. Перш за все, це вимагає алфавітного сортування (мої файли зазвичай сортуються за чисельністю), але навіть тоді я не можу змусити його працювати, не поскаржившись на неправильний порядок та пропустивши деякі записи. Тож мені це не подобається. grep -f проти файлу з ^id\t-s відбувається дуже повільно, коли кількість ідентифікаторів велика.
awkгроміздкий.
Чи є для цього хороші рішення? Якісь інструменти для файлів, розділених вкладками? Додаткова функціональність теж буде вітатися.
UPD: виправлено sort->join
awk.
sortможе робити всі види сортування, числові, алфавітні та інші. Див man sort.
grep -fце занадто повільно, підтримка цієї стратегії звучить як більше проблем, ніж варто - зміни, швидше за все, стануть здобиччю до тих самих проблем роботи O (N * M). Можливо, ваш час було б краще витратити на вивчення нормалізованого SQL БД ...