Regexp в потоке данных

Вот сценарий 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
2
27.09.2016, 01:34
4 ответа

Спасибо всем, это окончательное решение :)

#!/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
0
29.04.2021, 00:47

Просто используйте 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 завершает работу после того, как выведет эту информацию.

0
29.04.2021, 00:47
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 в противном случае).

0
29.04.2021, 00:47

В этом примере я пытаюсь дать более яркое представление о том, что происходит. Немного поработайте со скриптом, и вы получите желаемый результат.

#!/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
0
29.04.2021, 00:47

Теги

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