Можно сортировать | уникальный или сортировать | awk подсчитывает повторяющиеся значения из одного столбца?

Используя следующие данные:

$cat p1.csv
R,3
R,4
S,1
S,2
S,3
R,2
T,4
R,3
ST,4
RST,2
RSTR,4

Первая сортировка на основе столбца 2:

$cat p1.csv | sort -t "," -k2
S,1
R,2
RST,2
S,2
R,3
R,3
S,3
R,4
RSTR,4
ST,4
T,4

Я хочу подсчитать количество 1, 2, 3 и 4 из второго столбца. Что-то вроде $cat p1.csv | сортировать -t "," -k2 | uniq -f2 -c ..... Можно ли применить uniq к одному столбцу? -f2 неправильно применяет uniq к правильному полю. Вывод должен принимать первый экземпляр уникального значения во втором столбце и подсчитывать их количество. Следовательно, данные должны быть сначала отсортированы по столбцу два. Правильный вывод будет выглядеть так:

1 S,1
3 R,2
3 R,3
4 R,4

Предложения?


person blehman    schedule 23.05.2013    source источник
comment
Я уверен, что это можно сделать с помощью awk. Вероятно, вы могли бы сделать что-то гораздо более беспорядочное и действительно требующее скрипта с использованием uniq, sort, grep -c, иначе это было бы не так эффективно.   -  person lurker    schedule 24.05.2013
comment
Я не понимаю вашего вывода. где ST, T, RST, RSTR? какой первый столбец в выводе?   -  person Kent    schedule 24.05.2013
comment
Обратите внимание, что каждая из следующих строк является первым экземпляром числа, появляющегося во втором столбце: S, 1 R, 2 R, 3 R, 4. Операция должна останавливаться в первом случае уникального значения во втором столбце и подсчитывать количество уникальных номеров. Итак, @Kent, чтобы ответить на ваш вопрос, ST, T, RST, RSTR не считаются уникальными. Только значения во втором столбце уникальны.   -  person blehman    schedule 24.05.2013


Ответы (2)


Ваш вопрос не совсем ясен, поэтому я просто преобразовал ваш вывод в ваш ввод (при условии, что в вашем выводе есть опечатка, поскольку вы упомянули о подсчете количества 1, 2 и 3 из столбца 2 и показать 2 R,2). Вам, вероятно, нужно будет немного лучше объяснить свой вопрос -

sort -t "," -k2 < p1.csv |   
awk -F, '!z[$2]++{ a[$2]=$0; } END {for (i in a) print z[i], a[i]}' |  
sort -k1

Объяснение:

 - !z[$2]++ removes the duplicates based on column 2 as awk progresses thru 
   each line. 
 - a[$2]=$0 stores the non-duplicates lines in an array
 - END {..} looks at all the keys in array and pulls up values. For array a 
   it pulls up the first line it sees with unique column 2 (as your desired 
   output). For array z it pulls up number of lines seen with same column 2.

Контрольная работа:

[jaypal:~/temp] cat file
R,3
R,4
S,1
S,2
S,3
R,2
T,4
R,3
ST,4
RST,2
RSTR,4

[jaypal:~/temp] sort -t "," -k2 < t |   
awk -F, '!z[$2]++{ a[$2]=$0; } END {for (i in a) print z[i], a[i]}' |  
sort -k1
1 S,1
3 R,2
3 R,3
4 R,4

Сортировать с опцией -u

Для поиска уникальных записей на основе столбца вы можете попробовать отсортировать с параметром -u (но это не даст вам подсчета).

Со страницы man:

-u, --unique
              with -c, check for strict ordering; 
              without -c, output only the first of an equal run

Вы можете попробовать что-то вроде этого -

sort -t, -k2 p1.csv | sort -u -t, -k2

Использование Uniq

Я не уверен, что Uniq можно выполнить для столбца, разделенного разделителем, отличным от пробела. По крайней мере, на моем Mac это не так. Вот ссылка на справочную страницу

-f num  Ignore the first num fields in each input line when doing comparisons.  
        A field is a string of non-blank characters separated
        from adjacent fields by blanks.  Field numbers are one based, 
        i.e., the first field is field one.

Поэтому, если вы можете удалить разделитель , и запустить следующую команду, вы должны получить желаемый результат.

sort -k2 test | uniq -c -f1

Контрольная работа:

[jaypal:~/temp] cat test
R 3
R 4
S 1
S 2
S 3
R 2
T 4
R 3
ST 4
RST 2
RSTR 4

[jaypal:~/temp] sort -k2 test | uniq -c -f1
   1 S 1
   3 R 2
   3 R 3
   4 R 4
person jaypal singh    schedule 23.05.2013
comment
$cat p1.csv | сортировать -t, -k2 | uniq -f2 -c ..... Можно ли применить uniq к одному столбцу? -f2 неправильно применяет uniq к правильному полю. - person blehman; 24.05.2013
comment
@Jaypal: если у вас есть минутка, не могли бы вы объяснить части вашей функции awk ?? - person blehman; 24.05.2013
comment
@simplyclimb Добавлено объяснение и ответ на ваш первый вопрос. Надеюсь, это поможет. - person jaypal singh; 24.05.2013

Я только что столкнулся с интересным случаем повторяющихся значений в наборе данных, который легко разрешим, и я просто хотел рассказать об этом всем, кому это может быть интересно.

Я добавляю два дополнения (*) к набору данных:

$cat p1.space
  R 3
  R 4
  S 1
  S 2
  S 3
  R 2
  T 4
  R 3
  ST 4
  RST 2
  RSTR 4
  R* 5
  R* 5

Новое значение включает повторяющуюся запись R* 5. Отсортировав второй столбец, мы видим новые значения ниже:

$sort -k2 p1.space
  S 1
  R 2
  RST 2
  S 2
  R 3
  R 3
  S 3
  R 4
  RSTR 4
  ST 4
  T 4
  R* 5
  R* 5

Обратите внимание, что повторяющийся элемент (R* 5) считается за две записи:

$sort -k2 p1.space | uniq -f1 -c
  1 S 1
  3 R 2
  3 R 3
  4 R 4
  2 R* 5

Чтобы сохранить количество уникальных строк, мы должны сделать уникальный набор данных перед подсчетом количества уникальных строк:

$sort -k2 p1.space | uniq | uniq -f1 -c
  1 S 1
  3 R 2
  2 R 3
  4 R 4
  1 R* 5

Я надеюсь, что это поможет любому, у кого могут быть аналогичные требования к подсчету. Удачи! И спасибо @Jaypal.

person blehman    schedule 26.05.2013