Как использовать сортировку в awk по столбцу 3

90

У меня есть такой файл (user.csv)

ip,hostname,user,group,encryption,aduser,adattr

хотите распечатать всю сортировку столбцов по пользователю,

Я пробовал awk -F ":" '{print|"$3 sort -n"}' user.csv, не работает.

user2452340
источник
11
sort -t, -k3 file
Кевин

Ответы:

174

Как насчет того, чтобы просто sort.

sort -t, -nk3 user.csv

где

  • -t,- определяет ваш разделитель как ,.

  • -n- дает вам числовую сортировку. Добавлено, так как вы добавили его в своей попытке. Если ваше пользовательское поле является только текстом, оно вам не нужно.

  • -k3- определяет поле (ключ). пользователь - третье поле.

Джайпал Сингх
источник
2
Как я могу использовать сортировку по 2 столбцам? например, я хочу сначала отсортировать по столбцу 6, а затем - по столбцу 3.
user2452340
1
Это не сработает, если в CSV есть строки в кавычках, содержащие запятые (если столбец, по которому вы хотите выполнить сортировку, не расположен раньше, чем столбец, содержащий запятые). Возможно, вам придется сначала выполнить проход с помощью awk (используя FPAT = "[^,] * | \" [^ \ "] * \" "и OFS =" | "или какой-либо другой разделитель, который можно использовать с сортировкой)
davemyron
1
@ user2452340 Вы можете сделать это: sort -t, -nk3 filename.csv | sort -t, -nk6- сначала он будет отсортировать по столбцу 3, затем отсортирует его по столбцу 6, чтобы столбец 6 был правильно отсортирован полностью, а для любых строк, в которых столбец 6 такой же, они будут отсортированы по столбцу 3 .
Матфея
3
@Matthew sort -t ',' -k3,3n -k6,6nбудет лучше. -k3будет использовать столбец 3 и оставшуюся часть строки.
Кусалананда
1
Мне просто нужен -t, чтобы разделить мой файл с двумя столбцами, разделенными запятыми, спасибо jaypal
Рикардо Ривера Ньевес
20
  1. Используйте awk, чтобы указать идентификатор пользователя впереди.
  2. Сортировать
  3. Используйте sed, чтобы удалить повторяющийся идентификатор пользователя, при условии, что идентификаторы пользователей не содержат пробелов.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
пользователь3781670
источник
Это очень полезно, особенно если вам нужно проанализировать или объединить столбцы, чтобы добавить поле сортировки, а затем сохранить только исходную строку. Я использовал awk / split для анализа / объединения полей даты и времени для сортировки, а затем удаления.
Skytaker
1
sortуже знает, как сортировать по определенному столбцу, но этот метод, известный как преобразование Шварца , полезен, когда поле, по которому вы хотите выполнить сортировку, не является тривиальным четко определенным столбцом.
tripleee
10

Вы можете выбрать разделитель, в этом случае я выбрал двоеточие и напечатал столбец номер один, отсортировав по алфавиту:

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Диего Роберто душ Сантуш
источник
9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

и в обратном порядке

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 
всингх
источник
6

попробуй это -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

ИЛИ

sort -t',' -nk3 user.csv
ВИПИН КУМАР
источник
2
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

Это должно работать

user13608932
источник
0

Чтобы исключить первую строку (заголовок) из сортировки, я разделил ее на два буфера.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
rupert160
источник