Условная замена значений ячеек именами столбцов - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть матрица ранга 165 x 165, так что каждая строка имеет значения в диапазоне 1-165. Я хочу проанализировать каждую строку и удалить все значения> = 5, отсортировать каждую строку в порядке возрастания, а затем заменить значения 1-5 именем столбца из исходной матрицы.

Например, для строки k значения 1, 2, 3, 4, 5 будут получены после первых двух преобразований и будут заменены на p, d, m, n, a.

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

Это решение GNU sed может работать, хотя его нужно будет масштабировать, поскольку я использовал только матрицу 10x10 для целей тестирования:

# { echo {a..j};for x in {1..10};do seq 1 10 | shuf |sed 'N;N;N;N;N;N;N;N;N;s/\n/ /g';done; }> test_data
# cat test_data                                                                                 
a b c d e f g h i j
4 5 9 3 6 2 10 8 7 1
3 7 4 2 1 6 10 5 8 9
10 9 3 1 2 7 8 5 6 4
5 10 4 9 7 8 1 3 6 2
8 6 5 9 1 4 3 2 7 10
2 8 9 3 5 6 10 1 4 7
3 9 8 2 1 4 10 6 7 5
3 7 2 1 8 6 10 4 5 9
1 10 8 3 6 5 4 2 7 9
7 2 3 5 6 1 10 4 8 9
# cat test_data |
sed -rn '1{h;d};s/[0-9]{2,}|[6-9]/0/g;G;s/\n|$/ &/g;s/$/&1 2 3 4 5 /;:a;s/^(\S*) (.*\n)(\S* )(.*)/\2\4\1\3/;ta;s/\n//;s/0[^ ]? //g;:b;s/([1-5])(.*)\1(.)/\3\2/;tb;p'
j f d a b      
e d a c h      
d e c j h      
g j h c a      
e h g f c      
h a d i e      
e d a f j      
d c a h i      
a h d g f      
f b c h d   

Команда sed работает следующим образом.

Первая строка файла данных содержит заголовки столбцов, которые сохраняются в области удержания, затем пространство шаблона (текущая строка) удаляется.Для всех последующих строк данных все две или более цифр и значения от 6 до 9 преобразуются в 0. Имена столбцов добавляются вместе с новой строкой к значениям данных.Пробелы вставляются перед новой строкой и концом строки.Данные преобразуются в поиск и отсортированные значения т.е.1 2 3 4 5 добавлен к этому.Новая строка удаляется вместе со всеми 0 значениями и соответствующими поисками.Значения от 1 до 5 заменяются именами столбцов в поиске.

РЕДАКТИРОВАТЬ:

Возможно, я неправильно понял проблему с сортировкой столбцов или строк, если это так, это минимальное исправление - заменить 1 2 3 4 5 по исходным значениям и выполните числовую сортировку перед заменой числовых данных именами столбцов из поиска.

1 голос
/ 12 ноября 2011

Я предполагаю, что ваш массив состоит из массива массивов ...

Ни Awk, ни Sed, ни Perl не имеют многомерных массивов.Однако их можно эмулировать в Perl, используя массивы массивов.

$a[0]->[0] = xx;
$a[0]->[1] = yy;
[...]
$a[0]->[164] = zz;

$a[1]->[0] = qq;
$a[1]->[1] = rr;
[...]
$a[164]->[164] = vv;

Имеет ли это смысл?

Я называю строку $x и столбцы $y, поэтомуэлемент в вашем массиве будет $array[$x]->[$y].Это хорошо?

Хорошо, ваши имена столбцов будут в строке $array[0], поэтому, если мы найдем значение меньше пяти в $array[$x]->[$y], мы знаем, что имя столбца находится в $array[0]->[$y].Это хорошо?

for my $x (1..164) { #First row is column names
  for my $y (0..164)  {
    if ($array[$x]->[$y] <= 5) {
        $array[$x]->[$y] = $array[0]->[$y];
    }
  }
}

Я просто просматриваю все строки, и для каждой строки, все столбцы и проверяю значение.Если значение меньше или равно пяти, я заменяю его именем столбца.

Надеюсь, я не делаю вашу домашнюю работу за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...