Как выбрать определенный процент строк? - PullRequest
0 голосов
/ 04 марта 2019

Доброе утро!

У меня есть файл .csv со 140 строками и 26 столбцами.Мне нужно отсортировать строки в соответствии со значениями в столбце 23. Это пример:

Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller2,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-1088,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller3,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-2159,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,

Чтобы отсортировать строки в соответствии со значениями столбца 23, я делаю это:

awk -F "%*," '$23 > 4' myfikle.csv

Результат:

Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,

В моем примере я использую значение 4% в столбце 23, целью которого является получение всех строк с их значением в%, которое значительно увеличивается в столбце 23.Проблема в том, что я не могу основываться на значении 4%, потому что оно представляет только текущую таблицу.Поэтому мне нужно найти другой способ получить строки с высоким значением в столбце 23.

Я должен отсортировать контроллеры в порядке убывания в соответствии с процентным соотношением в столбце 23, я предпочитаю обрабатывать первые 10% отсортированных строк, чтобы убедиться, что у меня контроллеры с большим процентом.

Цель состоит в том, чтобы иметь возможность варьировать процент в зависимости от количества строк в таблице.

У вас есть какие-нибудь советы по этому поводу?

Спасибо!:)

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Если вы хотите использовать стандартные инструменты, вам нужно прочитать файл дважды.Но если вы согласны использовать Perl, вы можете просто сделать:

perl -e 'my @sorted = sort <>; print @sorted[0..$#sorted * .10]' input-file
0 голосов
/ 04 марта 2019

Вот один из способов, которым GNU awk может получить верхние p % из файла, но они выводятся в порядке появления:

$ awk -F, -v p=0.5 '               # 50 % of top $23 records
NR==FNR {                          # first run
    a[NR]=$23                      # hash precentages to a, NR as key
    next
}
FNR==1 {                           # second run, at beginning
    n=asorti(a,a,"@val_num_desc")  # sort percentages to descending order
    for(i=1;i<=n*p;i++)            # get only the top p %
        b[a[i]]                    # hash their NRs to b
}
(FNR in b)                         # top p % BUT not in order
' file file | cut -d, -f 23        # file processed twice, cut 23rd for demo
45.04%
19.18%

Немного комментируя это.

0 голосов
/ 04 марта 2019

Я мог бы поклясться, что этот вопрос был дубликатом, но до сих пор я не смог найти аналогичный вопрос.

Не имеет значения, отсортирован ваш файл или нет.Из любого файла вы можете извлечь NUMBER первые строки с head -n NUMBER.Нет встроенного способа указать число в процентах, но вы можете вычислить, что PERCENT% строк вашего файла NUMBER строк.

percentualHead() {
  percent="$1"
  file="$2"
  linesTotal="$(wc -l < "$file")"
  (( lines = linesTotal * percent / 100  ))
  head -n "$lines" "$file"
}

или короче, но менее читабельно

percentualHead() {
  head -n "$(( "$(wc -l < "$2")" * "$1" / 100  ))" "$2"
}

При вызове percentualHead 10 yourFile будут напечатаны первые 10% строк от yourFile до стандартного вывода.

Обратите внимание, что percentualHead работает только с файлами, поскольку файл должен быть прочитан дважды.Он не работает с FIFO, <() или трубами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...