2013-12-06 2 views
1

Я хочу сортировать данные, подобные приведенному ниже по первому полю, а затем по дате в третьем поле. Затем сохраняйте только последние для каждого идентификатора (поле 1) - независимо от второго поля.bash сортировать по нескольким полям и дедуплицировать

id1,description1,2013/11/20 
id2,description2,2013/06/11 
id2,description3,2012/10/28 
id2,description4,2011/12/04 
id3,description5,2014/02/09 
id3,description6,2013/12/05 
id4,description7,2013/12/05 
id5,description8,2013/08/14 

Таким образом, ожидаемый результат будет

id1,description1,2013/11/20 
id2,description2,2013/06/11 
id3,description5,2014/02/09 
id4,description7,2013/12/05 
id5,description8,2013/08/14 

Благодаря Jomon

+1

Используйте 'sort' для сортировки и' awk' для удаления дубликата результата. – Barmar

ответ

2

Вы можете использовать AWK:

> cat file 
id1,description1,2013/11/20 
id1,description1,2013/11/19 
id2,description2,2013/06/11 
id2,description3,2012/10/28 
id2,description4,2011/12/04 
id3,description5,2014/02/09 
id3,description6,2013/12/05 
id4,description7,2013/12/05 
id5,description8,2013/08/14 

> sort -t, -k1,1 -k3,3r file | awk -F, '!a[$1]++' 
id1,description1,2013/11/20 
id2,description2,2013/06/11 
id3,description5,2014/02/09 
id4,description7,2013/12/05 
id5,description8,2013/08/14 
+0

Я не говорил об этом другом ответе. Я чувствую, что должен: так, как вы это делали, чтобы получить правильный ответ для данного ввода. В качестве примера добавьте 'id1, description1,2013/11/19' в строку 2 ввода и наблюдайте за тем, что вы получите. – devnull

+0

Если я вставляю 'id1, description1,2013/11/19' в запись # 2, то на выходе он отображает' id1, description1,2013/11/19' в качестве первой записи. – anubhava

+0

Именно поэтому это неверно. Желаемый результат должен содержать последнюю дату, т. Е. Он должен быть «2013/11/20', а не« 2013/11/19 ». (Предполагая, что у меня вопрос правильный.) – devnull

0

Попробуйте это:

cat file |sort -u|awk -F, '{if(map[$1] == ""){print $0; map[$1]="printed"}}' 

Объяснение:

Я использую sort для сортировки (ну не может быть проще)

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

Если нет (карта [$ 1] == "") Я печатаю и сохраняю «напечатанную» на карте [$ 1] (так что в следующий раз она не будет равна «» для текущего значения $ 1).

1

вызов sort дважды; в первый раз, сортировать по дате. Во втором вызове сортируйте однозначно в первом поле, но делайте это стабильно, чтобы элементы с одинаковым идентификатором оставались отсортированными по дате.

sort -t, -k3,3r data.txt | sort -t, -su -k1,1 
+0

Наверное, никогда не случалось, что можно использовать '-u' в сочетании с' -k'. Фантастика! – devnull

+0

В идеальном мире будет работать 'sort -t, -k3,3r -k1,1u data.txt'. – chepner

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