Як використовувати 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, щоб розділити свій файл із 2 стовпцями, розділений комами, дякую Джейпалу
Рікардо Рівера

20
  1. Використовуйте awk, щоб поставити ідентифікатор користувача попереду.
  2. Сортувати
  3. Використовуйте sed, щоб видалити дублікат ідентифікатора користувача, припускаючи, що ідентифікатори користувачів не містять пробілів.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Це дуже корисно, особливо якщо вам потрібно проаналізувати або об'єднати стовпці, щоб додати поле сортування, а потім зберегти лише вихідний рядок. Я використовував awk / split для синтаксичного аналізу / об'єднання полів дати та часу для сортування, а потім видалення.
skytaker

1
sortвже знає, як сортувати за певним стовпцем, але цей прийом - відомий як перетворення Шварца - корисний, коли поле, за яким потрібно сортувати, не є тривіально чітко визначеним стовпцем.
триплі

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.