На странице руководства bash:
set [+ abefhkmnptuvxBCEHPT] [+ o option-name] [arg ...]
Без параметров имя и значение каждой переменной оболочки отображаются в формате, который можно повторно использовать в качестве входных данных для установки или сброса текущих установленных переменных.
...
По умолчанию параметры отключены, если не указано иное. Использование + вместо - приводит к отключению этих параметров.Параметры также могут быть указаны как аргументы для вызова оболочки. Текущий набор опций можно найти в $ -. Статус возврата всегда истина, если не встречается недопустимая опция.
Решения, которые устанавливают начальное значение 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
Использование Миллера(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
Использование 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