Сортировка двух столбцов с помощью 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

сортирует второе поле в обратном порядке.

Другие вопросы по тегам