2013-12-20 1 views
1

У меня есть текстовые файлы в папке. Ниже приведены данные текстовых файлов.Как я могу подсчитать уникальные поля в файле?

USA  Germany 23-12 
USA  Germany 23-12 
USA  Germany 23-12 
France Germany 15-12 
France Germany 15-12 
France Italy  25-50 
China China  30-32 
China China  30-32 

Я хотел бы рассчитать уникальные номера каждой страны в первой и второй колонках на основе номеров третьего столбца. Мне нужно сохранить выходы в другую папку в качестве имен файлов ввода.

Желаемая выход

USA  1 
Germany 2 
France 2 
Italy  1 
China  2 
+4

Интересно, кто upvoted это. Как вы получили цифры во втором столбце вывода? – perreal

+0

@perreal «уникальные номера каждой страны в первой и второй колонках на основе номеров третьей колонки» - да, это добавляет цифры, которые он говорит – janos

ответ

1
perl -lane' 
    $F[2] .= 1 if $F[0] eq $F[1] and $s{$F[0]}; 
    $s{$_}{$F[2]} = 1 for @F[0,1]; 
    END { printf("$_\t%s\n", scalar keys %{$s{$_}}) for sort keys %s } 
' file 

и если вопросам заказа,

perl -lane' 
    $F[2] .= 1 if $F[0] eq $F[1] and $s{$F[0]}; 
    push(@r,$s{$_} ?() : $_), $s{$_}{$F[2]} = 1 for @F[0,1]; 
    END { printf("$_\t%s\n", scalar keys %{$s{$_}}) for @r } 
' file 

выход

USA  1 
Germany 2 
France 2 
Italy 1 
China 2 
+0

Китай должен быть 2. – janos

+0

@janos да, но кажется, что есть ошибка либо в входе или выходе OP –

+0

@mpapec Спасибо за ваш ответ. Китай должен быть 2. Это не ошибка. – user3122011

1

Учитывая этот awk код в parse.awk:

function get_name(name_colon_x) { 
    return substr(name_colon_x, 1, index(name_colon_x, ":") - 1) 
} 
{ 
    u1[$1 ":" $3] 
    u2[$2 ":" $3] 
} 
END { 
    for (i in u1) u[get_name(i)]++ 
    for (i in u2) u[get_name(i)]++ 
    for (i in u) print i, u[i] 
} 

И ваши данные в data.txt, то:

$ awk -f parse.awk data.txt 
USA 1 
France 2 
Germany 2 
China 2 
Italy 1 
+0

+1 Я думаю, что это интересное решение. Мне просто интересно, что вы могли бы избежать использования функции? –

+0

@janos Спасибо за ваш ответ. Последний символ первого столбца не выводится на мой вывод. Кроме того, я хотел бы распечатать выходы в другую папку с именами файлов ввода. Как я могу изменить вашу программу? – user3122011

+0

@ user3122011 Я не понимаю вашу проблему с последним символом первого столбца ... Но в любом случае решение mpapec лучше Perl. Для второй части вашей проблемы я думаю, что лучше спросить другой вопрос, и если вы не хотите, чтобы он закрылся, вам нужно продемонстрировать некоторые усилия: попытайтесь что-то сделать, показать, что вы пробовали, и затем попросите о помощи. – janos

Смежные вопросы