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

Я пытаюсь извлечь имя столбца с максимальным значением в каждой строке, используя сценарий bash, то есть значение заголовка столбца или значение из того же столбца в первой строке. Я использую следующее, чтобы извлечь максимальное значение из каждой строки в CSV-файле, но не могу узнать, как напечатать его имя столбца вместе с максимальным значением:

awk -F ',' '{max=$'$col1';for (i=1;i<=NF;i++) {if ($i > max){max=$i}};print " max: " max}' "$INPUT_PATH/tmp.csv" >>$INPUT_PATH/max1.csv 

Пример:

Примеры данных CSV:

 col1,col2,col3,col4 1,5,2,6 4,0,1,2 1,2,0,0 0,0,7,0 

Желаемый результат:

 col4 6 2 col1 4 1 col2 2 2 col3 7 3 

Есть ли способ сделать это в приведенной выше команде или есть лучший способ извлечь нужную информацию из файла CSV?

4 Solutions collect form web for “Как извлечь имя столбца (заголовок) из файла CSV, который содержит максимальное значение в строке?”

Ваше будущее «я» (и кто-то другой, кто должен поддерживать программное обеспечение) будет благодарен вам, если вы используете для этого язык, такой как Python. Конечно, это не будет однострочный, но, по крайней мере, это читаемый наивный псевдокод, что-то вроде этого (полностью непроверенный):

 import csv import defaultdict with open('max1.csv') as file_handle: csv_reader = csv.reader(file_handle) headers = csv_reader.next() maxes = defaultdict(0) # Or negative infinity for values in csv_reader: for index in range(len(values)): if value > maxes[headers[index]]: maxes[headers[index]] = value 

Немного непонятно, что вы спрашиваете, я предполагаю, что вы хотите печатать для каждого максимального значения строки заголовка строки и столбца для столбца, в котором это значение найдено:

 BEGIN { FS = ","; } NR == 1 { for (i = 1; i <= NF; i++) { x[i] = $i; } next; } { max = $1 + 0; for (i = 1; i <= NF; i++) { if (max <= ($i + 0)) { v[x[i]] = $i + 0; max = (v[x[i]] >= max) ? v[x[i]] : max; } } printf("Row %d: Column(s): ", NR); for (i in v) { if (max == v[i]) printf("%s ", i); } print "max value: " max; } 

Вы можете сохранить выше в файле file.awk и запустить:

 awk -f file.awk your input 

Итак, для данного ввода:

 col1,col2,col3,col4,col5,col6,col7,col8 -1,-2,-22,-4,-1,-2,-4,-8 -9,-3,-2,-1,-2,-4,-5,-7 0,-3,-2,-1,-10,-11,-2,-8 

Выход должен быть:

 Row 2, Colums(s): col1 col5 max value: -1 Row 3, Colums(s): col4 col5 max value: -1 Row 4, Colums(s): col1 max value: 0 

Следующее допускает повторение максимума в той же строке.

 awk -F, 'NR==1 { split($0,head,FS); next } { max=0; delete a; for(i=1;i<=NF;i++) if($i>=max){ max=$i; a[max]=a[max]head[i]" ("i"), " } print "max " max "\t" substr(a[max], 0, length(a[max])-2) }' file 

вход:

 hdr A,hdr B,hdr C,hdr D,hdr E,hdr F 5,2,7,4,7,-9 1,5,4,3,2,1 1,5,9,9,5,3 

вывод:

 max 7 hdr C (3), hdr E (5) max 5 hdr B (2) max 9 hdr C (3), hdr D (4) 

Проблема с CSV заключается в том, что он не разбирается с обычными инструментами оболочки. Они просто не делают это красиво. Это можно сделать в тривиальных случаях, но на самом деле – язык сценариев – это инструмент для работы.

Я бы подумал больше лично:

 #!/usr/bin/env perl use strict; use warnings; use Text::CSV; my $csv = Text::CSV->new(); open ( my $input, "<", "your_file.csv" ) or die $!; $csv->column_names( $csv->getline( $input ) ); while ( my $row = $csv->getline_hr( $input ) ) { my ( $highest, @rest ) = sort { $row->{$b} <=> $row->{$a} } keys %$row; print join( "\t", $highest, $row->{$highest} ), "\n"; } 

Что, если использовать в качестве входных данных:

 first,second,third,fourth 1,3,4,5, 5,4,3,2, 1,1,4,1, 

Будет печать:

 fourth 5 first 5 third 4 
  • Выполнить команду на основе результата предыдущей команды (без сбоя всего оператора)
  • Включение подпараметров в варианты справки для правильного выполнения без getopt или getopts?
  • Как удалить конечную новую строку в bash?
  • Что такое безопасный и переносимый способ разделить строку в программировании оболочки?
  • Установить команду, если команда не существует
  • Копировать только Конкретный текст файла в другой
  • Ssh в поле, запустить команду, вывести данные в файл, а затем перейти к следующему IP-адресу
  • Git Bash для Ubuntu / Linux и Windows требует перезагрузки ssh-agent
  • обнаружить, если PDF-файл сделан из изображений
  • Сценарий оболочки: если несколько условий
  • Как выбрать наивысший элемент числа во многих файлах со многими массивами
  • Interesting Posts

    Несколько совпадений и печати в одной строке

    Есть ли безопасный (https) официальный сайт для хэшей CentOS iso?

    Использование `sed` в Android без модификатора` g`?

    Как запустить скрипт с привилегиями, ожидаемыми от общего «предполагаемого пользователя» сценария?

    Есть ли способ хранить почтовые вложения вне почтовых ящиков?

    Почему «дата» не уважает мой язык?

    Что означает – означает объединение с файлами и каталогами Linux

    Как перечислить весь уникальный ip-адрес, который в настоящее время подключен к определенному порту?

    GlusterFS как выполнить переход на другой ресурс (умный), если подключенный сервер вышел из строя?

    Отображение командной строки (PS1) для набора каталогов

    Поддерживает ли vsftpd простой FTP?

    Понимание регистрации в Linux

    Как мне маршрутизировать bittorrent через второй интерфейс?

    nodogsplash build: необъявленный идентификатор

    Может ли сценарий определять, какие символы может отображать терминал?

    Linux и Unix - лучшая ОС в мире.