2009-09-25 3 views
5

У меня есть много файлов с результатами команды: уник -c some_file> some_file.outрезультаты Объединить из Uniq -c

Например: 1.out:

 
1 a 
2 b 
4 c 

2.out

 
2 b 
8 c 

Я хотел бы объединить эти результаты, так что я получаю:

 
1 a 
4 b 
12 c 

Я думал, что сортировка или uniq могут обрабатывать его, но я не вижу никаких связанных с ним вариантов. Написание скрипта ruby ​​/ perl является одним из способов, но я хотел бы сделать это легко с помощью команд ядра * nix (например, упомянутого sort и uniq).

Редактировать: Чтобы быть ясным. У меня нет оригинальных файлов, и мне нужно объединить файлы * .out.

Спасибо за помощь!

+0

Я предполагаю, что должно быть решение, включающее только join, awk и expr. –

ответ

3

Попробуйте его с awk:

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

Хорошо, это должно сработать для меня. Это не идеально, потому что я рассчитываю сделать это с использованием памяти O (N), где N - количество файлов, но оно будет работать некоторое время (если у меня не будет больших результатов). Благодаря! – radarek

+0

Я не думаю, что это линейное число файлов, потому что 'awk' читает все файлы в последовательности, по одной строке за раз, и нужно только хранить массив' count' (хеш-таблица?) В памяти. – Philipp

+0

Я не сказал, что решение, данное Филиппом, является линейным. Я сказал, что можно написать такое решение. – radarek

0

Это довольно специфическая проблема, так что вряд ли какой-либо инструмент будет делать это по умолчанию. Вы можете создать скрипт в достаточно маленьком цикле (без необходимости awk nastyness), реализованный на любом языке сценариев (даже sh). Я не думаю, что есть другой способ.

0

Это не совсем серьезно (но это работает). Мне нравится решение Philipps.

cat 1.out 2.out | 
{ 
    while read line; do 
     for i in $(seq ${line% *}); do 
      echo ${line#* } 
     done 
    done 
} | sort | uniq -c 
Смежные вопросы