Обработка текста с использованием sed / awk / perl

Терминал всегда доступен через /dev/tty, независимо от того, откуда был перенаправлен стандартный ввод.

read -rs 'pw?Password: ' </dev/tty
0
06.10.2017, 14:13
1 ответ

Использование Raku (, ранее известного как Perl _6)

raku -e 'say.key, " => ",.value.words[1,3,5...*] for lines.split(/<[:\s]>/, :skip-empty).rotor(2).classify( *.[0]);'

Пример ввода:

ABCDEFG_10_node10:2154  ABCDEFG_10_node10:54
ABCDEFG_10_node10:2254  ABCDEFG_10_node10:64
ABCDEFG_10_node10:410 ABCDEFG_10_node10:10
ABCDEFG_10_node10:210 ABCDEFG_10_node10:10 
ABCDEFG_10_node10:365
ABCDEFG_10_node10:890
ABCDEFG_10_node10:741
XXYZZ_71_node2:24: XXYZZ_71_node2:504:
X3y5z_53_node1:664: X3y5z_53_node1:990:
RCTY_11_node2:224: RCTY_11_node2:234:

Пример вывода:

XXYZZ_71_node2 => (24 504)
RCTY_11_node2 => (224 234)
ABCDEFG_10_node10 => (2154 54 2254 64 410 10 210 10 365 890 741)
X3y5z_53_node1 => (664 990)

Вкратце, linesсчитываются, разрушая splitпо :и \s(, опуская любые пустые элементы через :skip-empty),rotor(соединяя )каждые 2 элемента, иclassify-с помощью первая из каждой пары. [Я мог бы позвонить .classify( *.[0].unique), чтобы уточнить намерения, но Раку в любом случае поступает правильно].

Если ОП действительно хочет формат, указанный в его/ее сообщении, то замените =>на : и добавьте вызов joinв конце вызова .value, чтобы весь раздел до forчитается как:say.key, ": ",.value.words[1,3,5...*].join(",")

Пример вывода (2):

X3y5z_53_node1: 664,990
RCTY_11_node2: 224,234
ABCDEFG_10_node10: 2154,54,2254,64,410,10,210,10,365,890,741
XXYZZ_71_node2: 24,504

https://docs.raku.org/routine/classify
https://raku.org

0
04.10.2021, 20:40

Теги

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