У меня есть матрица, которая выглядит следующим образом:
Вход :
A B C D E F G H I
0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 1 0 0 0 1 0 0
1 0 0 1 0 0 0 1 0
1 0 0 0 1 1 1 0 0
И я хотел бы извлечь для каждой строки список букв, соответствующих значению 1.
Выход :
E,I
D
D
A
A,C,G
A,D,H
A,E,F,G
Я попытался разделить заголовок и сопоставить слова с числами, но мне не удалось.
text-processing
awk
fusion.slope
источник
источник
NR == 1 { split($0,values) }
next
в конце первой строки, чтобы вам не нужно было проверять противоположное условие для последующих строк.NR > 2
наNR > 1
.awk
, заключенном в одинарные кавычки , либо вставьте код в файл и запустите его с помощьюawk -f that.script.file input-file
Еще один с
perl
-a
возможность разбить строку ввода на пробелы, доступные в@F
массивеif($. == 1){ @h=@F }
сохранить заголовок, если первая строка@i = grep {$F[$_]==1} (0..$#F)
сохранить индекс, если запись1
print join ",",@h[@i]
выводить только те индексы из массива заголовков, которые используются в,
качестве разделителяисточник
Все еще для забавы,
zsh
версия:${a:^b}
Застегните два массива, чтобы получить A 0 B 0 C 0 D 0 E 1 F 0 G 0 H 0 I 1${(j<>)...}
соединяет элементы, между которыми ничего нет, поэтому он становится A0B0C0D0E1F0G0H0I1${...//(?0|1)}
мы снимаем?0
и1
с него так получается EI:${(s<>)...}
разделить на ничего, чтобы получить массив из одного элемента на букву: EI${(j<,>)...}
присоединиться к тем с,
-> E, я.источник
zsh
это другая оболочкаbash
(и гораздо более мощная, и с гораздо лучшим дизайном, если вы спросите меня).bash
занял лишь малую долюzsh
«функции с (как{1..4}
,<<<
,**/*
) не те , упомянутые здесь, большинствоbash
» s особенности иначе заимствованы изksh
.Другое решение awk :
Выход:
источник
Вот решение в Perl:
Он работает путем чтения столбцов заголовков в массив и затем для каждой строки данных копирует имя столбца в выходной массив, если соответствующий столбец данных оценивается как true. Затем имена столбцов печатаются через запятую.
источник
Один
sed
для удовольствия:С помощью GNU
sed
вы можете сделать его более разборчивым с помощью:Немного более короткая версия, при условии, что в каждой строке всегда одинаковое количество цифр:
То же, что и выше, за исключением того, что мы меняем местами переведенную и индексную части, что позволяет оптимизировать ситуацию.
источник
python3
источник
Чистое решение Bash:
источник
LESS="+/^ {3}Array" man bash
должны дать всю информацию, необходимую для Bash массивов. Вы можете редактировать ответ, чтобы добавить любые полезные разъяснения.источник