2014-02-19 4 views
0

У меня есть большой файл CSV, я хочу отсортировать его по столбцу2 и столбцу3 и взять только первые 3 строки, имеющие уникальные значения из столбца2. Поэтому я ищу что-то вроде:Извлечь первые 3 строки с значениями uniq из CSV-файла

sort -k2,2 -k3,3 -u2,2-3 (в действительности нет части -u2,2-3).

Любая идея, как это сделать на командной строке, не написав программу самостоятельно?

+0

_ «без написания программы самостоятельно?» _ Вы закончите писать программу для CLI (которая будет выполнена bash) –

ответ

0

Это уродливо, но я думаю, что это сработает.

Предположения:

  1. Ваш файл называется $FILE.
  2. Файл содержит только цифры, разделенные запятыми.

Код:

awk 'BEGIN { FS="," } !/^$/ { print NR,$2,$3 }' < $FILE | 
    sort -nk 2,3 | 
    awk '{ print $1,$2 }' 
    uniq -uf 1 | 
    head -n 3 | 
    while read num ignore; do sed -n "${num}p" < $FILE; done 

Line построчно Объяснение:

  1. awk: печати номер строки и поля 2 и 3 всех не пустых строк в файл. В дальнейшем мы будем использовать номер строки в качестве индекса для извлечения нужных строк из $FILE, после того, как мы сортируется на полях 2 и 3.
  2. sort: Сортировка вывода численно полей 2 и 3.
  3. awk: Вытащите поле 3, оставив только номер строки и поле 2.
  4. uniq: Распечатайте только те строки, которые являются уникальными, игнорируя номер строки.
  5. head: Печать только первые 3 строки.
  6. while: Прочитайте 3 номера строк, игнорируя оставшуюся часть каждой строки. Распечатайте эту строку из исходного файла.
Смежные вопросы