2009-09-25 7 views
5

Tengo muchos archivos con resultados de comandos: uniq -c some_file> some_file.outresultados de la combinación de uniq -c

Por ejemplo: 1.out:

 
1 a 
2 b 
4 c 

2 .out

 
2 b 
8 c 

me gustaría combinar estos resultados, así que conseguir:

 
1 a 
4 b 
12 c 

Pensé que sort or uniq podría manejarlo pero no veo ninguna opción relacionada con él. Escribir una secuencia de comandos de ruby ​​/ perl es una de las mejores, pero me gustaría hacerlo fácilmente con los comandos core * nix (como los mencionados sort y uniq).

Editar: Para ser claro. No tengo archivos originales y tengo que fusionar * .out archivos.

¡Gracias por la ayuda!

+0

Supongo que debería haber una solución que implique solo join, awk y expr. –

Respuesta

3

intentarlo con awk:

awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' 1.out 2.out 
+0

Ok, debería funcionar para mí. No es ideal porque espero hacerlo con un uso de memoria O (N), donde N es el número de archivos, pero funcionará durante un tiempo (a menos que tenga grandes resultados). ¡Gracias! – radarek

+0

No creo que sea lineal en el número de archivos porque 'awk' lee todos los archivos en secuencia, una línea a la vez, y solo necesita mantener la matriz' count' (tabla hash?) En la memoria. – Philipp

+0

No dije que la solución dada por Philipp es lineal. Dije que se puede escribir tal solución. – radarek

0

Es todo un problema específico, por lo que es poco probable que cualquier herramienta va a hacer esto por defecto. Puede guiarlo en un bucle lo suficientemente pequeño (sin necesidad de desagradable awk), implementado en cualquier lenguaje de scripting (incluso sh). No creo que haya otra manera.

0

Esto no es del todo grave (pero funciona). Me gusta la solución de Philipps.

cat 1.out 2.out | 
{ 
    while read line; do 
     for i in $(seq ${line% *}); do 
      echo ${line#* } 
     done 
    done 
} | sort | uniq -c 
Cuestiones relacionadas