сортировка и удаление дубликата в unix из файла - PullRequest
0 голосов
/ 26 июня 2018

Ниже был мой входной файл, но мой фактический ввод содержит миллионы записей,

004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

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

Ожидаемый результат:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

, что я пытался, но я хочу сделать все в одной команде вместо другого шага, а также дубликатудаление не происходит должным образом с -u?

sort -t$'," -k2 pp.txt > pp1.txt
sort -t$'," -k6 -r pp1.txt > pp2.txt
sort -t$'," -k2 -u pp2.txt > pp3.txthere

Пожалуйста, помогите

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

GNU sort:

sort -t, -k2,2 -k6,6nr -u pp.txt

Выход:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47
0 голосов
/ 26 июня 2018

Не могли бы вы попробовать и дайте мне знать, если это поможет вам.

sort -t, -k2,2 -k6,6nr   Input_file | awk -F, '!a[$2]++'
0 голосов
/ 26 июня 2018

Используя gnu awk, вы можете сделать это одной командой:

awk -F, 'BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
!($2 in ts) || $6 > ts[$2] { ts[$2]=$6; row[$2]=$0 }
END { for (i in row) print row[i] }' file

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

Условия !($2 in ts) || $6 > ts имеет 2 подусловия с предложением OR. Первое условие означает, что если $2 как ключ отсутствует в массиве с именем ts, а второе условие означает, что если $2 присутствует, то если текущая временная метка или $6 больше, чем та, которая присутствует в массиве (, таким образом, что позволяет нам хранить наибольшее время для одной и той же вейла $2 в конечном массиве)

0 голосов
/ 26 июня 2018

Вы должны сделать это с помощью:

sort -t, -u -k2,2 pp.txt

и результат:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47
...