Я використовую багато сорту 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 БД ...