Как извлечь имя столбца (заголовок) из файла 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 
  • Пытаться направить содержимое переменной в команду дает Ambigious Redirect
  • файл резервной копии локально в сценарии оболочки
  • Как вставить строку в массив по-разному
  • Сортировка каталогов и файлов в каждом каталоге в порядке возрастания и экспорт данных в csv
  • Команды X не начинаются с моей работы
  • Возможно одновременное использование скобок (перестановки) и расширения массива?
  • Как сделать вывод для grep неудачным?
  • Есть ли что-то эквивалентное getch () в ksh?
  • оптимизировать команду с помощью or или pipe для анализа вывода ifconfig
  • Как подключить и отключить соединение openvpn в сценарии bash?
  • Bash test wc с ошибкой '-ge' - деление на 0
  • Linux и Unix - лучшая ОС в мире.