Вот сценарий perl, который делает то, что вы хотите. Он создает хэшированный массив (индексированный строкой, состоящей из "gene_id gene_name"), содержащий массив образцов tpm.
После завершения чтения всех файлов он выводит каждый элемент хешированного массива. Обратите внимание, что скрипт не требует ровно 6 элементов, и не ограничен <= 6 - он будет работать для любого количества элементов tpm.
Если некоторые gene_id'ы имеют 6 элементов массива tpm, а другие - 1, 5 или 1000 элементов, то для каждого gene_id'а будет выведено точное количество элементов tmp, обнаруженных для этого gene_id'а/имени гена. Смотрите ниже дополнительный код, который можно добавить, чтобы рассматривать это как ошибку, а не как особенность.
Входные данные могут быть предоставлены на stdin и/или путем указания имен файлов для обработки в командной строке.
#! /usr/bin/perl
my %samples = () ;
while(<>) {
chomp;
s/^\s*|\s*$//g;
next if (m/^Gene_ID|^$/);
my ($gene_id, $gene_name, undef,undef,undef,undef,undef,undef, $tpm) = split;
$tpm = 0 unless (defined($tpm));
push @{ $samples{"$gene_id $gene_name"} }, $tpm;
}
foreach my $key ( keys %samples ) {
my ($gene_id, $gene_name) = split(/\s+/,$key);
print "$gene_id\t$gene_name\t", join("\t", @{ $samples{"$gene_id $gene_name"} }), "\n";
}
Вывод скрипта разделен табуляцией. Если вы предпочитаете что-то другое, отредактируйте строку print
в скрипте и замените ВСЕ \t
на предпочитаемый вами разделитель.
Если вы хотите выдать сообщение об ошибке и выйти, если для каждого gene_id не напечатано ровно 6 элементов tpm, добавьте следующий код сразу после строки my ($gene_id, $gene_name) = split(/\s+/,$key)
:
my $count = scalar @{ $samples{"$gene_id $gene_name"} };
if ($count != 6) { die "Warning: $gene_id $gene_name has $count element(s)\n"};
Пример вывода:
Я сделал 6 копий предоставленного вами образца данных под названием sample. txt
до sample6.txt
. Сохранил perl
скрипт выше как sample.pl
, сделал его исполняемым с помощью chmod +x sample.pl
и запустил его:
$ ./sample.pl sample*.txt
ENSMUSG00000104123 Gm37483 0 0 0 0 0 0
ENSMUSG00000102175 Gm6119 0.008621 0.008621 0.008621 0.008621 0.008621 0.008621
ENSMUSG00000102735 Gm7369 0 0 0 0 0 0
ENSMUSG00000025900 Rp1 0 0 0 0 0 0
Спасибо всем, это окончательное решение :)
#!/bin/bash
battery=$(gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" " | tail -n 1)
echo $battery
if [[ $battery -ge 50 ]]; then
# Exit 0 = OK
echo OK
exit 0
elif [[ $battery -ge 30 ]]; then
# Exit 1 = WARNING
echo WARNING
exit 1
elif [[ $battery -ge 0 ]]; then
# Exit 2 = CRITICAL
echo CRITICAL
exit 2
else
# Exit 3 = Unknown
echo UNKNOWN
exit 3
fi
Просто используйте grep
:
gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" "
Это должно дать вам процент в виде числа.
Затем вы можете обернуть команду и использовать ее как переменную:
level=$(gammu monitor 2>&1 | grep -e "Battery level" | tr -s " " | cut -f 4 -d" ")
if [[ $level -ge 50 ]]; then
exit 0
elif [[ $level -ge 25 ]]; then
exit 1
else
exit 2
fi
Насколько я понимаю, gammu monitor
завершает работу после того, как выведет эту информацию.
gammu monitor | awk '/^Battery level/{exit($4 < 25 ? 2 : $4 <= 50)}'
Выше использовано условие ? true-part : false-part
троичного оператора, встречающегося во многих языках (C, perl, Java... и др.). Если $4 < 25
, возвращает 2, в противном случае возвращает результат логического выражения $4 <= 50
(которое равно 1, когда истинно, и 0 в противном случае).
В этом примере я пытаюсь дать более яркое представление о том, что происходит. Немного поработайте со скриптом, и вы получите желаемый результат.
#!/bin/bash
obtain_level=$(gammu monitor | awk '/Battery level/{print $4}')
if (( obtain_level <= 25 ))
then
echo "less than 25"
elif (( obtain_level >= 26 || obtain_level <= 50 ))
then
echo "between 25 and 50"
else
echo "good"
fi