Парсинг таблицы текстового файла и агрегация информации

Драйверы видеовыхода, скомпилированные в Вашу версию mplayer, могут быть просмотрены путем выполнения

mplayer -vo help

Относительно которого необходимо выбрать, когда, часть этого будет очевидна из вывода справки (для тех, которые нацелены на определенные видеокарты [mga, s3fb, и т.д.], или выходные форматы [aa, png, и т.д.]). Некоторые являются устаревшими (я не думаю, что VIDIX пошел куда угодно, или GGI). Другие, я не могу помочь Вам с. Я использую xv когда я могу и отступать к x11. Другие несколько специализированы поэтому, если я не нахожу причину использовать один, я привычка.

3
28.06.2012, 18:30
2 ответа

Вот решение в awk который использует 4 массива для подсчета этих 4 сведений, Вам нужно. Вывод от awk затем питается в column который выравнивает столбцы приятно. (Обратите внимание, что в этом, возможно, также выполнили awk использование printf.)

awk 'NR>1 {
    id[$1]++
    if($6 ~ /Pass/) pass[$1]++
    if($8 ~ /1/) he[$1]++
    if($9 ~ /1/) ho[$1]++
} 
END {
   print "Id CountId Countpass CountHe CountHO"
   for(i in id)
      print i" "id[i]" "(pass[i]?pass[i]:0)" "(he[i]?he[i]:0)" "(ho[i]?ho[i]:0)
}' input.txt | column -t

Вывод:

Id            CountId  Countpass  CountHe  CountHO
cm|371443198  1        1          1        0
cm|371443199  3        3          2        1
cm|367079424  2        2          0        2
3
27.01.2020, 21:13
  • 1
    Получить выходную последовательность как выход FIFO (как упомянуто в комментарии к ответу Birei, только незначительные изменения необходимы... (1) Добавляют новую строку после открытия { фигурная скобка: if(!id[$1]) nr[ln++]=$1 ... (2) Удаляют строку for(i in id) и замените его: for( n=0;n<ln;n++ ) { i=nr[n] ... (3) Изменение закрытие } фигурная скобка к }} сбалансировать дополнительную фигурную скобку представило в (2) - (+1 btw) –  Peter.O 06.07.2012, 02:53

Один способ использовать perl принятие infile имеет содержание Вашего вопроса (идентификаторы не будут обязательно в том же порядке в выводе, потому что я использую хеш для сохранения их):

Содержание script.pl:

use strict;
use warnings;

my (%data);

while ( <> ) { 

    ## Omit header.
    next if $. == 1;

    ## Remove last '\n'.
    chomp;

    ## Split line in spaces.
    my @f = split;

    ## If this ID exists, get previously values and add values of this
    ## line to them. Otherwise, begin to count now.
    my @counts = exists $data{ $f[0] } ? @{ $data{ $f[0] } } : (); 
    $counts[0]++;
    $counts[1]++ if substr( $f[5], 0, 4 ) eq q|Pass|;
    $counts[2] += $f[7];
    $counts[3] += $f[8];
    splice @{ $data{ $f[0] } }, 0, @{ $data{ $f[0] } }, @counts; 
}

## Format output.
my $print_format = qq|%-15s %-10s %-12s %-10s %-10s\n|;

## Print header.
printf $print_format, qw|Id CountId CountPass CountHe CountHo|;

## For every ID saved in the hash print acumulated values.
for my $id ( keys %data ) { 
    printf $print_format, $id, @{ $data{ $id } };
}

Выполните его как:

perl script.pl infile

Со следующим выводом:

Id              CountId    CountPass    CountHe    CountHo   
cm|371443198    1          1            1          0         
cm|371443199    3          3            2          1         
cm|367079424    2          2            0          2
4
27.01.2020, 21:13
  • 1
    спасибо. Я получаю ошибочное Использование неинициализированного значения в printf в script.pl строке 35. Это возможный отобразить идентификатор в том же порядке, как появляются во входном файле спасибо –  jack 28.06.2012, 20:13

Теги

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