Подсчет уникальных значений в столбце с помощью сценария оболочки - PullRequest
5 голосов
/ 06 мая 2010

У меня есть файл с разделителями табуляции с 5 столбцами, и мне нужно получить из столбца 2 только количество уникальных строк. Обычно я делаю это с Perl / Python, но я вынужден использовать для этого оболочку.

В прошлом я успешно использовал * nix uniq функцию, переданную по каналу wc, но, похоже, здесь мне придется использовать awk.

Любой совет будет принят с благодарностью.(Ранее я задавал аналогичный вопрос о проверках столбцов с использованием awk, но это немного отличается, и я хотел отделить его, поэтому, если у кого-то в будущем возникнет этот вопрос, он будет здесь)1007 * Лилли

Ответы [ 3 ]

18 голосов
/ 06 мая 2010

Не нужно использовать awk.

$ cut -f2 file.txt | sort | uniq | wc -l

должен это сделать.

При этом используется тот факт, что tab является разделителем полей по умолчанию cut, поэтому таким образом мы получим только содержимое второго столбца. Затем проход через sort работает как предварительный этап к uniq, который удаляет дубликаты. Наконец, мы считаем строки, которые являются искомым числом.

5 голосов
/ 06 мая 2010

Я выбираю

$ cut -f2 file.txt | sort -u | wc -l

По крайней мере, в некоторых версиях uniq полагается на сортировку входных данных (она смотрит только на соседние строки).

Например, в Solaris docs :

Утилита uniq считывает входной файл, сравнивая соседние строки, и записывает одну копию каждой входной строки на выходе.Вторая и последующие копии повторяющихся соседних строк ввода не будут записаны.

Повторные строки на входе не будут обнаружены, если они не соседствуют.

0 голосов
/ 23 июля 2012
awk '{if($0~/Not Running/)a++;else if($0~/Running/)b++}END{print a,b}' temp
...