ANSI не играет роли в этом процессе. Этого никогда не было, за исключением удобства именования . ANSI определил набор из 8 цветов, которые большинство людей насчитывают от 0 до 7. При расширении схемы до 16, 88 и 256 цветов было удобно создать массив значений цвета, которые адресуются с помощью индекса того же типа.
X-сервер (и ваша конфигурация дисплея) действительно играют определенную роль.
xterm берет шестнадцатеричное значение из ваших ресурсов или косвенно через имя в rgb.txt
и запрашивает у X-сервера цвет, "близкий" к значению R / G / B. Сервер может (и часто делает) приблизительные цвета. В исходном коде xterm хорошим местом для начала чтения является (достаточно подходящее) AllocateAnsiColor .
Дополнительная литература:
Вот сценарий perl, который выполняет эту работу. Он читает stdin и извлекает имена файлов для использования в качестве ключа к хэшированному массиву %wavfiles
. Используемая структура данных представляет собой хэш-массив - хэшированный массив, каждый элемент которого является списком (т.е. массивом), содержащим одно или несколько значений.
Когда он видит строку, соответствующую regex /Interpretation Score/
И если $filename
не является пустым, он использует split()
для извлечения оценки интерпретации и помещает ее в массив, содержащийся в $wavfiles{$filename}
. Затем он очищает $filename
, чтобы предотвратить добавление ложных данных для этого ключа.
Когда больше нет входных данных для чтения, он распечатывает содержимое %wavfiles
hash-of-arrays в формате CSV.
Этот скрипт будет работать с любым количеством входных файлов любого размера. Он рассматривает все имена файлов, указанные в командной строке, и/или все данные, переданные по трубопроводу из stdin, как один входной поток.
Порядок входных данных имеет значение - он напрямую влияет на порядок интерпретационных баллов в выходных данных (например, если скрипт видит 567 перед 55, то именно в таком порядке он будет отображать эти значения. и наоборот).
Скрипт не ограничен только двумя интерпретационными оценками для каждого имени файла - он выведет столько, сколько увидит для каждого имени файла, разделенных запятыми, в том порядке, в котором он их увидел.
#! /usr/bin/perl
use strict;
my %wavfiles = ();
my $filename = '';
while(<>) {
chomp; # strip line-feed from end of line
$filename = $_ if (m/\.wav$/);
if ((m/Interpretation Score/) && (! -z $filename)) {
my (undef,$score) = split /: /; # split input line on ': '
push @{ $wavfiles{$filename} }, $score;
$filename = '';
};
}
foreach $filename (keys %wavfiles) {
print "$filename,", join(",",@{ $wavfiles{$filename} }),"\n";
}
Вывод с использованием вашего примера входных данных:
$ ./interpscore.pl file1 file2
message_bbb.wav,972,34
Message_ccc.wav,921
message_aaa.wav,567,55
message_ccc.wav,12
Обратите внимание, что хэш-ключи, как и имена файлов, чувствительны к регистру, поэтому здесь есть запись для Message_ccc.wav
(с заглавной буквой М) и message_ccc.wav
(со строчной буквой М) - это то, что было в ваших входных файлах. Вам нужно отредактировать входные файлы так, чтобы имена файлов были согласованы - после этого на выходе будет:
$ ./interpscore.pl file1 file2
message_aaa.wav,567,55
message_ccc.wav,921,12
message_bbb.wav,972,34
Примерно так с awk
:
awk '/^[mM]essage_.*.wav/{
n=NR+5;i=tolower($1)
}
n==NR{
a[i]=a[i]","$4
}
END{
for ( i in a){
print i""a[i]
}
}' file1 file2
Если строка начинается с [mM] essage _. *. Wav
, переменная n
устанавливается на NR + 5
(номера строк, где значение Оценка интерпретации
) и имя файла wav сохраняются в переменной a i
.
Когда n == NR
и создается массив с индексом i
, и к этому массиву добавляется Оценка интерпретации
($ 4).
END
вывести весь индекс массива и его значение по желанию.
Здесь я всегда принимал строку Оценка интерпретации
как 5-ю строку в каждом тесте.
grep -e 'wav\|Inter' file1.txt | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0",";next;}1' > file1new.txt
grep -e 'wav\|Inter' file2.txt | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0",";next;}1' > file2new.txt
join -t, file1new.txt file2new.txt