Сортировка двух столбцов с помощью sort и uniq
У меня есть файл, который требует особой сортировки, но я не могу понять, как это сделать.
Я попробовал следующую команду, но она не дает мне то, что я хочу:
sort -t" " -k1,1 Original_File | uniq -d > Desired_Output
Исходный файл:
User1 US
User1 NG
User2 US
User3 US
User4 US
User4 EN
User5 US
Desired_Output:
User1 US
User1 NG
User4 US
User4 EN
2 ответа
Вы можете извлечь первый столбец, взять дубликаты и снова извлечь их из файла:
cut -f1 -d' ' Original_File | sort | uniq -d | grep -wFf- Original_File
Пример ввода и вывода обновлен; примеры в первом разделе используют исходный пример ввода, чтобы показать подробные примеры вариантов:
Оригинальный ввод в Original_File
:
User1 US
User1 NG
User2 US
User3 US
User4 US
User5 US
Вы можете пропустить userN
часть для uniq
с возможностью -f
пропустить ведущие поля - разделенные пробелом:
$ sort -t" " -k1,1 Original_File | uniq -f 1
User1 NG
User1 US
Для того же порядка, что и в выходных данных примера, вы можете изменить порядок сортировки - это изменит значения "меток" уникальных строк:
$ sort -r -t" " -k1,1 Original_File | uniq -f 1
User5 US
User1 NG
Обратите внимание User5
в первой строке результата. Если это не приемлемо, просто сортируйте снова:
$ sort -t" " -k1,1 Original_File | uniq -f 1 | sort -t" " -k1,1 -r
User1 US
User1 NG
Если UserN
деталь не разделена пробелом, но имеет фиксированную длину, ее можно пропустить для uniq
с возможностью -s
:
$ sort -t" " -k1,1 Original_File | uniq -s 6
User1 NG
User1 US
В обновленном примере ввода это команда для создания необходимого порядка сортировки:
$ sort -t" " -k1,1 Original_File | uniq -f 1 | sort -t" " -k1,1 -k2,2r
User1 US
User1 NG
User4 US
User4 EN
сортирует второе поле в обратном порядке.