perl -F'\s+' -lane '$,="\t"; # OFS made a TAB
my($gN, $gL) = splice @F, 0, 2; # store gene name & length
print $gN, $gL, map { sprintf "%.5e", $F[$_] / ( $F[$_+@F/2] * $gL ) } 0 .. @F/2-1;
' gene_samples.file
FS
содержит один или несколько пробелов.ORS = RS = \n
@F
содержит поля для данной записи.splice
отделяет 2 элемента, начиная со смещения 0, а также уменьшает размер массива.A1BG 1758 6.55307e-10 5.67278e-08 3.73151e-09
A1BG-AS1 2126 5.11204e-11 9.43963e-10 1.78875e-10
A1CF 9695 1.99136e-08 8.28471e-09 1.42845e-09
A2M 5399 6.42672e-08 5.20606e-08 4.24207e-08
A2M-AS1 6660 1.63186e-10 1.12999e-10 1.71301e-10
Мы могли бы использовать awk
или sed
или даже grep
с регулярными выражениями Perl, чтобы выбрать только число из этой строки, например.
$ lscpu | sed -n 's/^Core(s) per socket: *//p'
2
А вам нужно это число, количество ядер в одном сокете? Что делать, если у вас более одного сокета на машине:
$ lscpu |grep -i socket
Core(s) per socket: 2
Socket(s): 2
Мы могли бы использовать awk
, чтобы получить оба числа и умножить их:
$ lscpu | awk '/^Core.s. per socket:/ {cores=$NF} /^Socket.s.:/ {sockets=$NF} END {print cores * sockets}'
4
Я не уверен, считают ли они гиперпотоки или нет, и нужны ли нам гиперпотоки или нет, но мы могли бы просто получить число в строке CPU(s)
:
lscpu | awk '/^CPU.s.:/ { print $NF; exit }'
Или используйте nproc
, чтобы получить общее количество процессоров в системе.
$ nproc --all
4
Для этого можно использовать утилиту getconf
. Это должно сработать для вас
$ getconf _NPROCESSORS_ONLN
8