Utilizo una gran cantidad de grep awk en mi shell de Unix para trabajar con archivos de texto de columna separados por tabulaciones de tamaño mediano (alrededor de 10M-100M líneas). A este respecto, Unix Shell es mi hoja de cálculo.
Pero tengo un gran problema: seleccionar registros con una lista de ID.
Al tener un table.csvarchivo con formato id\tfoo\tbar...y un ids.csvarchivo con la lista de identificadores, solo seleccione los registros table.csvcon el ID presente ids.csv.
tipo de /programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-ids pero con shell, no perl.
grep -Fobviamente produce falsos positivos si los identificadores son de ancho variable.
joines una utilidad que nunca podría entender. En primer lugar, requiere una clasificación alfabética (mis archivos generalmente están ordenados numéricamente), pero aun así no puedo hacer que funcione sin quejarme por un orden incorrecto y omitir algunos registros. Entonces no me gusta. grep -f contra el archivo con ^id\t-s es muy lento cuando el número de identificadores es grande.
awkes engorroso
¿Hay alguna buena solución para esto? ¿Alguna herramienta específica para archivos separados por tabulaciones? La funcionalidad adicional también será bienvenida.
UPD: corregido sort->join
awk.
sortPuede hacer todo tipo de clasificación, numérica, alfabética y otras. Ver man sort.
grep -fes demasiado lento, mantener esta estrategia parece más problemas de lo que vale: las variaciones probablemente serán víctimas de los mismos problemas de rendimiento O (N * M). Tal vez su tiempo se gastaría mejor aprendiendo cómo usar una base de datos SQL normalizada ...