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.csv
archivo con formato id\tfoo\tbar...
y un ids.csv
archivo con la lista de identificadores, solo seleccione los registros table.csv
con 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 -F
obviamente produce falsos positivos si los identificadores son de ancho variable.
join
es 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.
awk
es 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
.
sort
Puede hacer todo tipo de clasificación, numérica, alfabética y otras. Ver man sort
.
grep -f
es 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 ...