Как я могу распечатать разницу между максимальным и минимальным значением записи?

Я не видел ни одного драйвера Radeon, загруженного из вывода вашей команды lsmod

Я показал вывод lsmod ниже здесь с использованием драйвера Intel GM500

# lsmod

gma500_gfx 192512 2

i2c_algo_bit 16384 1 gma500_gfx

drm_kms_helper 126976 1 gma500_gfx

Какую версию ядра вы использовали в linuxmint 18.1?

Вы можете перейти в / lib / modules / kervel-versin drivers / gpu / drm / radeon /

Вы можете выполнить следующую команду здесь:

# modinfo radeon.ko

Вам следует проверить вывод команды modinfo о вашем драйвере Radeon.

Если вы не можете его найти. Вам следует скачать драйвер Radeon HD 7770 с веб-сайта radeon.

2
13.04.2017, 16:08
4 ответа
Подход

awk с использованием многомерных массивов и функции asort :

awk 'NR==1{ h=$0; } NR>1 { b[NR]=$0;a[$1][length(a[$1])+1]=$3; }
    END { print h,"diff";
        for (i in a) { asort(a[i]) } 
        for (k=2;k<=NR;k++) { 
            split(b[k],sep); max=length(a[sep[1]]); 
            print b[k],a[sep[1]][max] - a[sep[1]][1]
        } 
    }' file

Вывод:

Id str mt no   diff
101 2 550 1 350
101 3 540 2 350
101 3 350 3 350
101 4 600 4 350
101 4 700 5 350
102 1 400 1 200
102 4 500 2 200
102 4 350 3 200
102 3 550 4 200
103 3 500 1 250
103 4 300 2 250
103 3 550 3 250
0
27.01.2020, 22:40

Вот «педагогическая» версия:

awk '
NR == 1 {
  header=$0
}
NR > 1 {
  line[NR]=$0
  if($4==1) {
    min[$1]=max[$1]=$3
  }
  else {
    if(min[$1]>$3) min[$1]=$3
    if(max[$1]<$3) max[$1]=$3
  }
}
END {
  printf("%s diff\n",header)
  for(i=2;i<=NR;i++) {
    split(line[i],e)
    printf("%s %d\n",line[i],max[e[1]]-min[e[1]])
  }
}
' datafile > output

Предполагая, что столбец id гарантированно упорядочен, вот более быстрая версия который также использует гораздо меньше памяти:

awk 'function f() {for(i in r) printf("%s %d\n",r[i],u-l); delete r}
NR == 1 {printf("%s diff\n",$0)}
NR > 1 {if($4==1) {f(); l=u=$3}
  else {if(l>$3)l=$3; if(u<$3)u=$3}
  r[$4]=$0 }
END {f()}
'  datafile > output

Оба этих сценария генерируют запрошенный вывод и работают с POSIX-совместимыми реализациями awk, т.е. не требуют расширений GNU awk, таких как asort .

0
27.01.2020, 22:40

Вот двухпроходное решение

awk -f runawk first_pass=1 file first_pass=0 file

, где содержимое runawk равно

FNR == 1 && /^Id/{
  if (!first_pass) print
  next
}
first_pass{
  if (!($1 in max)){
    min[$1] = max[$1] = $3
    next
  }
  max[$1] = $3 > max[$1]? $3: max[$1]
  min[$1] = $3 < min[$1]? $3: min[$1]
}
!(first_pass){
    print $1, $2, $3, max[$1] - min[$1]
}
0
27.01.2020, 22:40
perl -lane '
     push @A, $_; next if $. == 1; ($a, $b) = @F[0,2];

     $b > ($M{$a} // -Inf)  and $M{$a} = $b;
     $b < ($m{$a} // +Inf)  and $m{$a} = $b;

     END{$,=$";
        print shift @A, q/diff/;
        ($a) = /\d+/g, print $_, $M{$a} - $m{$a} for @A;
     }
' datafile

Результат:

Id str mt no diff
101 2 550 1 350
101 3 540 2 350
101 3 350 3 350
101 4 600 4 350
101 4 700 5 350
102 1 400 1 200
102 4 500 2 200
102 4 350 3 200
102 3 550 4 200
103 3 500 1 250
103 4 300 2 250
103 3 550 3 250
0
27.01.2020, 22:40

Теги

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