Как сделать следующее форматирование с помощью sed или awk или bash скрипта на linux

ANSI не играет роли в этом процессе. Этого никогда не было, за исключением удобства именования . ANSI определил набор из 8 цветов, которые большинство людей насчитывают от 0 до 7. При расширении схемы до 16, 88 и 256 цветов было удобно создать массив значений цвета, которые адресуются с помощью индекса того же типа.

X-сервер (и ваша конфигурация дисплея) действительно играют определенную роль.

xterm берет шестнадцатеричное значение из ваших ресурсов или косвенно через имя в rgb.txt и запрашивает у X-сервера цвет, "близкий" к значению R / G / B. Сервер может (и часто делает) приблизительные цвета. В исходном коде xterm хорошим местом для начала чтения является (достаточно подходящее) AllocateAnsiColor .

Дополнительная литература:

1
14.03.2016, 16:10
3 ответа

Вот сценарий 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
0
27.01.2020, 23:35

Примерно так с 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-ю строку в каждом тесте.

1
27.01.2020, 23:35
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

1
27.01.2020, 23:35

Теги

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