2009-09-25 10 views
5

Mam wiele plików z wynikami polecenia: uniq -c nazwa_pliku> some_file.outWyniki scalania z uniq -c

na przykład: 1.out:

 
1 a 
2 b 
4 c 

2.out

 
2 b 
8 c 

chciałbym połączyć te wyniki, więc mam:

 
1 a 
4 b 
12 c 

Myślałem, że sort lub uniq sobie z tym poradzą, ale nie widzę żadnej opcji z tym związanej. Napisanie jakiegoś skryptu ruby ​​/ perla jest jednym ze sposobów, ale chciałbym to zrobić w prosty sposób za pomocą poleceń core * nix (jak wspomniany sort i uniq).

Edytuj: Aby było jasne. Nie mam oryginalnych plików i muszę scalić pliki * .out.

Dzięki za pomoc!

+0

Podejrzewam, że powinno istnieć rozwiązanie obejmujące tylko join, awk i expr. –

Odpowiedz

3

Spróbuj z awk:

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

OK, to powinno działać dla mnie. Nie jest idealny, ponieważ spodziewam się tego przy użyciu pamięci O (N), gdzie N to liczba plików, ale będzie działać przez jakiś czas (chyba, że ​​mam duże wyniki). Dzięki! – radarek

+0

Nie sądzę, że liczba plików jest liniowa, ponieważ 'awk' odczytuje wszystkie pliki w kolejności, po jednej linii na raz, a jedynie zachowuje w pamięci tablicę' count' (tablica haszująca?). – Philipp

+0

Nie powiedziałem, że rozwiązanie podane przez Philippa jest liniowe. Powiedziałem, że można napisać takie rozwiązanie. – radarek

0

Jest to dość specyficzny problem, więc jest mało prawdopodobne, wszelkie narzędzia zrobi to domyślnie. Możesz napisać skrypt w wystarczająco małej pętli (bez potrzeby awk nastyness), zaimplementowanej w dowolnym języku skryptowym (nawet sh). Nie sądzę, że jest inny sposób.

0

To nie jest całkiem poważne (ale działa). Podoba mi się rozwiązanie Philippa.

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