Как извлечь имя столбца (заголовок) из файла CSV, который содержит максимальное значение в строке?

На странице руководства bash:

set [+ abefhkmnptuvxBCEHPT] [+ o option-name] [arg ...]

Без параметров имя и значение каждой переменной оболочки отображаются в формате, который можно повторно использовать в качестве входных данных для установки или сброса текущих установленных переменных.

...

По умолчанию параметры отключены, если не указано иное. Использование + вместо - приводит к отключению этих параметров.Параметры также могут быть указаны как аргументы для вызова оболочки. Текущий набор опций можно найти в $ -. Статус возврата всегда истина, если не встречается недопустимая опция.

2
25.07.2015, 17:28
3 ответа

Решения, которые устанавливают начальное значение mx=0, не будут работать, если все поля в записи будут отрицательными. Установка на $1безопасна, и тогда поля могут быть зациклены, как @Peter.O.

Просто для удовольствия, вот небольшой awkвариант перебора индексов массива headвместо создания счетчика и зацикливания

awk -F',' '
  NR==1{split($0,head,FS); next}
  {x=1; for  (h in head) if ($h>$x) x=h;print head[x], $x }
' file

Выход

col4 6
col1 4
col2 2
col3 7
1
27.01.2020, 23:10

Использование Миллера(https://github.com/johnkerl/miller)и запуск

 mlr --c2n merge-fields -a max -r "^[a-z]" -o value -k  then put '
  for (key, value in $*) {
    if (value == $value_max && key != "value_max") {
        $fieldName=key;
    }
}' then cut -f fieldName,value_max then reorder -f fieldName,value_max input.csv

у вас будет

col4 6
col1 4
col2 2
col3 7
1
27.01.2020, 23:10

Использование trиdatamash:

tr, '\t' < file.csv | datamash -H max 1-4 | datamash transpose

Выход:

max(col1)   4
max(col2)   5
max(col3)   7
max(col4)   6

Примечания:

  • Вывод можно очистить с помощью sed, если начальный max()не нужен.

  • Если количество столбцов точно не известно, но наверняка меньше некоторого большого числа, замените 1-4на 1-1000, добавляя нули по мере необходимости.

  • Чтобы получить точное количество, замените 4на $(head -1 file.csv | tr, ' ' | wc -w)или (, проанализировав заголовок с помощью оболочки POSIX )$(read x < file.csv; echo ${x##*l};).

    При очистке и точном подсчете результирующий более уродливый код будет выглядеть:

    tr, '\t' < file.csv | 
    datamash -H max 1-$(read x < file.csv; echo ${x##*l};) | 
    datamash transpose | sed 's/.*(\|)//g'
    

    Выход:

    col1    4
    col2    5
    col3    7
    col4    6
    
1
15.02.2020, 21:40

Теги

Похожие вопросы