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


90

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

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

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

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


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/^.* //'
    

Это очень полезно, особенно если вам нужно проанализировать или объединить столбцы, чтобы добавить поле сортировки, а затем сохранить только исходную строку. Я использовал 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 



0

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

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.