我在unix shell中使用了很多grep awk排序功能,以处理中等大小(大约10M-100M行)的制表符分隔的列文本文件。在这方面,unix shell是我的电子表格。
但是我有一个巨大的问题,那就是选择具有ID列表的记录。
如果table.csv
文件的格式id\tfoo\tbar...
和ids.csv
ID列表相同,请仅从table.csv
ID中存在的ID中选择记录ids.csv
。
一种/programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids,但带有shell,而不是perl。
grep -F
如果id为可变宽度,显然会产生误报。
join
是我永远无法弄清楚的实用程序。首先,它需要按字母顺序排序(我的文件通常按数字排序),但是即使那样,我也无法在不抱怨顺序错误和跳过某些记录的情况下使它起作用。所以我不喜欢它。^id\t
当id数量很大时,针对带有-s的文件的grep -f 非常慢。
awk
麻烦
有什么好的解决方案吗?制表符分隔文件的任何特定工具?额外的功能也将是最受欢迎的。
UPD:已更正sort
->join
awk
。
sort
可以进行各种排序,数字,字母排序和其他排序。请参阅man sort
。
grep -f
速度太慢,那么维持这种策略听起来会比其应有的麻烦还多,因为同样的O(N * M)性能问题,变化可能会成为危险。也许您最好花时间学习如何使用规范化的 SQL DB ...