Разобрать табличное содержимое файла с помощью однострочного файла или сценария bash

Не нужно echo, не нужно других бесполезных команд, один awk должен сделать всю работу:

$ xrandr | awk -F'[x ]' '/^   /{print $4"x"$5" \t"$4/$5}'

1024x600    1.70667
800x600     1.33333
640x480     1.33333
0
15.03.2018, 00:48
1 ответ
$ 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.

ПРИМЕЧАНИЕ:Существуют различные способы оптимизации этого алгоритма, я выбрал оптимизацию для удобочитаемости и простоты. Если ваши входные файлы не состоят из миллионов или миллиардов строк, производительность и потребление памяти вряд ли будут проблемой, для которой стоит оптимизировать.

2
28.01.2020, 02:32

Теги

Похожие вопросы