Linux: я хочу получить 10 лучших записей столбца3.В столбце отсутствуют некоторые данные.Я отсортировал файл - PullRequest
0 голосов
/ 15 февраля 2019

Я не уверен, как игнорировать отсутствующие данные здесь.

Мой ; отдельный файл выглядит так ( записывает его с пробелами, чтобы его можно было прочитать ):

Col1  Col2  Col3  Col4  Col5
12    a     ?     ?     ?
1     b     ?     ?     ?
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9
and so on....

Я хочу получить записи с максимальными значениями столбца 3

Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

Я отсортировал файл по столбцу 3 в обратном порядке.Не уверен, что делать дальше.

sort -t';' -k3 -r original.txt > newfile.txt 

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Что-то замечательное в командной строке - это то, что вы можете легко использовать лучший инструмент для правильного приложения, объединяя выходные данные с каналами | или создавая временные файлы, такие как newfile.txt.

В этом случае использование sort является подходящим выбором для сортировки ваших данных.После сортировки вы можете использовать отдельный инструмент, который очень эффективен при разборе данных, awk.

Начиная с вашего отсортированного newfile.txt, эта awk операция будет печатать только строку с 5 полями (при условии, что ваши отсутствующие данные фактически отсутствуют и нет пустых разделителей, например, ваша строка выглядит как 45;c;вместо 45;c;;;)

awk -F';' 'NF == 5 { print }' newfile.txt

Однако в случае, когда пустые поля разделены (например, 45;c;;;), и при условии, что только столбцы с 3 по 5 могут иметь пропущенные данные, это будет обрабатывать это:

awk -F';' 'NF == 5 && $3 && $4 && $5 { print }' newfile.txt

Обратите внимание: поскольку по умолчанию awk используется для печати, вышеприведенное { print } на самом деле не нужно, но включено педагогически.

Таким образом, от начала до конца вы можете получить желаемый результат с помощью

sort -t ';' -rk3 original.txt | awk 'NF==5 && $3 && $4 && $5' > result.txt
0 голосов
/ 15 февраля 2019

Вы можете использовать следующую команду:

$ head -1 fileToSort; (sort -k3 -n -r <(tail -n +2 fileToSort) | head)
Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9
1     b     ?     ?     ?
12    a     ?     ?     ?

, где fileToSort равно

 cat fileToSort 
Col1  Col2  Col3  Col4  Col5
12    a     ?     ?     ?
1     b     ?     ?     ?
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

Пояснения:

  • Используйте -t';', если ваш разделитель полей - ;
  • <(tail -n +2 fileToSort) исключит заголовок входного файла
  • Затем вы сортируете его с помощью 3-го ключа в обратном и числовом режиме, используя -n
  • head ограничит вывод при первых 10 записях
  • head -1 fileToSort; напечатает строку заголовка перед печатью первых 10 записей

Есливам нужно решение awk:

awk 'NR==1;NF == 5 && $3~/^[0-9]+(\.[0-9]+)+$/ && $4~/^[0-9]+(\.[0-9]+)+$/ && $5~/^[0-9]+(\.[0-9]+)+$/{buff[$3]=$0}END{n=asorti(buff,out); for (i = n; i >= 1; i--){print buff[out[i]]}}' fileToSort 
Col1  Col2  Col3  Col4  Col5
45    c     7.22  6.09  2.2
11    d     7.0   3.89  9.7
26    e     6.24  8.2  5.9

Может потребоваться добавить -F';' сразу после команды awk, если в вашем файле вместо пробелов есть ;.Ваша команда станет: awk -F';' ...

  • NR==1; напечатать первую строку
  • NF == 5 && $3~/^[0-9]+(\.[0-9]+)+$/ && $4~/^[0-9]+(\.[0-9]+)+$/ && $5~/^[0-9]+(\.[0-9]+)+$/ проверить, что у вас есть 5 полей и что значения 3 последних столбцов являются числовыми
  • {buff[$3]=$0} сохранить каждую строку в буфере, индексированном по значению col3
  • END{n=asorti(buff,out); for (i = n; i >= 1; i--){print buff[out[i]]}} в конце обработки, просто упорядочить массив в зависимости от значения индекса и распечататьэто в обратном порядке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...