Я использую много сортировки grep awk в моей оболочке Unix для работы с текстовыми файлами столбцов, разделенных табуляцией среднего размера (около 10–100 млн строк). В этом отношении Unix Shell - моя электронная таблица.
Но у меня есть одна огромная проблема - выбор записей по списку идентификаторов.
Имея table.csv
файл с форматом id\tfoo\tbar...
и ids.csv
файл со списком идентификаторов, выберите только записи table.csv
с идентификатором, присутствующим в 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 ...