Как извлечь имя столбца (заголовок) из файла 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 
  • Запустите файл .sh вместо его открытия.
  • Искать файлы ТОЛЬКО в подкаталоге
  • Bash Script для cp-файлов из списка
  • Команда для объединения всех окон терминала?
  • Отправить копию вывода скрипта в файл
  • уничтожение всех процессов, связанных со сценарием
  • (test -n $ st)! = (test -z $ st) право?
  • Заменить значение в одинарных кавычках в строке, содержащей определенное слово, используя команду sed
  • скрипт bash не создает псевдоним и не обновляет $ PS1
  • Монетный двор Linux: сделать «общедоступную интерактивную пусковую установку» только из корня sh?
  • Как найти слово и удалить его со следующей строкой
  • Linux и Unix - лучшая ОС в мире.