Не нужно echo
, не нужно других бесполезных команд, один awk
должен сделать всю работу:
$ xrandr | awk -F'[x ]' '/^ /{print $4"x"$5" \t"$4/$5}'
1024x600 1.70667
800x600 1.33333
640x480 1.33333
$ awk -F'|' '
NR==1 { header=$0 };
NR>1 && ($3 > colC[$1]) { colC[$1] = $3 ; line[$1] = $0};
END {
print header;
for (i in line) { print line[i] }
}' file.log
columnA | colB | colC | colD
name_1| data | 3 | data
name_2| data | 2 | data
Используя |
в качестве разделителя полей, этот awk
скрипт сохраняет первую строку в переменной header
, затем использует массив colC
для сохранения для каждого значения столбца A($1
)самого высокого значения. значение в столбце C ($3 ). Массив line
также используется для хранения всей соответствующей входной строки ($0
).
Наконец, когда весь ввод прочитан и обработан, он печатает каждую сохраненную строку. Вывод, вероятно, потребуется отсортировать, так как ассоциативные массивы не хранятся в каком-либо заданном порядке. -направляет вывод в sort
. В зависимости от входного файла строка заголовка может оказаться в середине вывода или в конце... в этом случае, возможно, лучше не сохранять и не печатать ее в скрипте awk
, а напечатать это в сценарии оболочки, который запускает сценарий awk.
ПРИМЕЧАНИЕ:Существуют различные способы оптимизации этого алгоритма, я выбрал оптимизацию для удобочитаемости и простоты. Если ваши входные файлы не состоят из миллионов или миллиардов строк, производительность и потребление памяти вряд ли будут проблемой, для которой стоит оптимизировать.