Как сортировать на основе столбца, но Uniq на основе другого столбца? - PullRequest
7 голосов
/ 10 июня 2011

Он все, у меня есть файл, имеющий несколько столбцов.Я хотел бы сделать сортировку для столбца 2, а затем применить uniq для столбца 1. Я обнаружил, что post говорит о сортировке и uniq для того же столбца, но моя проблема немного другая.Я думаю об использовании чего-то, используя sort и uniq, но не знаю как.Спасибо.

Ответы [ 4 ]

7 голосов
/ 10 июня 2011

Вы можете использовать трубу, но она не на месте.

Пример:

$ cat initial.txt
1,3,4
2,3,1
1,2,3
2,3,4
1,4,1
3,1,3
4,2,4

$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2
3,1,3
4,2,4
1,3,4
2,3,1

Результат сортируется по ключу 2, уникально по ключу 1. Обратите внимание, что результат отображается наконсоль, если вы хотите, чтобы это было в файле, просто используйте перенаправление (> newFiletxt)

Другое решение для этого вида более сложной операции - это полагаться на другой инструмент (в зависимости от ваших предпочтений (и возраста),awk, perl или python)

EDIT : Если я правильно понял новое требование, оно отсортировано по столбцу 2, столбец 1 уникален для данного столбца 2:

$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2
3,1,3
1,2,3
4,2,4
1,3,4
2,3,1
1,4,1

Это то, что вы ожидаете?Иначе я не поняла: -)

0 голосов
/ 25 сентября 2013

Я использовал это sort -t ',' -nk2

вот сортирует

1,2
2,5
3,1

to

3,1
1,2
2,5
0 голосов
/ 12 июня 2012

Просто чтобы быть уверенным, что я правильно понял, что вы имеете в виду.Вы хотите отсортировать файл на основе второго столбца в файле.Затем вы хотите удалить дубликаты из первого столбца (иначе говоря, применив uniq к первому столбцу!).круто, для этого вам нужно выполнить три задачи:

  1. отсортировать столбец, к которому будет применяться uniq (поскольку uniq может работать только на отсортированном вводе).
  2. применить uniq к отсортированному столбцу.
  3. отсортировать выходные данные на основе значений во втором столбце.

Использование каналов: Команда

 sort -t ',' -k1  fileName| awk '!x[$1]++' | sort -t ',' -k2

Обратите вниманиевы не можете указать первое поле в uniq, вы можете использовать переключатель -f для перехода к первым n полям.Следовательно, я использовал awk для замены uniq.

0 голосов
/ 10 июня 2011

uniq необходимо, чтобы данные были в порядке сортировки, поэтому, если вы sort во втором поле и затем примените uniq к первому полю, вы не получите правильный результат.

Вы можете попробовать

sort  -u -t,  -k1,1 filename | sort -t, -k2,2
...