2016-02-15 3 views
0

У меня возникли проблемы с форматированием большой 2D-матрицы в формат «разреженной матрицы». Надеюсь, кто-то здесь может помочь.Создание разреженной матрицы с использованием awk

Из-за большого размера файла следует предпочесть awk.

Вот гипотетический набор из данных (табуляция):

Regions  string8-0  string8-5000  string8-10000 
string8-0  0    2.1    1.15  
string8-5000  0    0     2.4 
string8-10000 0    4     3.1 

Таким образом, в результате вывод должен быть вкладка separeted файл с четырьмя колоннами. Column1 = числовая часть имен ростов (colomn1 из данных, пример: 0, 5000, 1000); Column2 = - соответствующая числовая часть столбцов (пример: 0, 5000, 10000), Столбец3 = значение между двумя ячейками. Column4 = строка части имен столбцов (строка8, строка8, строка8).

И напечатайте это только в том случае, если соответствующее значение не равно нулю.

так:

0  5000 2.1 string8 
0  10000 1.15 string8 
5000 10000 2.4 string8 
10000 5000 4  string8 
10000 10000 3.1 string8 

К сожалению, если это излишним вопрос, но я не мог найти какие-либо решения.

Спасибо, Laszlo

+1

Вы говорите, что у вас возникли проблемы --- то, что вы пробовали и какие неприятности в частности, у вас есть? – jas

ответ

0

EDIT: Теперь выводит отдельные строки для нескольких «хитов» в строке ввода

$ cat sp.awk 
BEGIN { FS = OFS = "\t" } 

NR == 1 { 
    for (c=2; c<=NF; ++c) { 
     split($c, col_parts, "-") 
     col_str[c] = col_parts[1] 
     col_num[c] = col_parts[2] 
    } 
    next 
} 

{ 
    split($1, parts, "-"); 
    col1 = parts[2] 
    for (c=2; c<=NF; ++c) { 
     if ($c != 0) { 
      print col1, col_num[c], $c, col_str[c] 
     } 
    } 
} 

$ awk -f sp.awk sp.txt 
0  5000 2.1  string8 
0  10000 1.15 string8 
5000 10000 2.4  string8 
10000 5000 4  string8 
10000 10000 3.1  string8 
+0

Я уверен, что мы сможем это сделать, хотя я точно не знаю, что вы имеете в виду. Измените свой вопрос, чтобы показать образец ввода и желаемый результат, который демонстрирует это требование. – jas

+0

Спасибо вам большое! Оно работает! Однако, как я могу добавить новую строку после каждого попадания? Итак, на основе этого примера он работает отлично, но в случае, если одна строка имеет несколько «хитов», она печатает эти образы в одной строке. Я хотел бы напечатать каждый хит в новой строке. Я отредактировал часть printf вашего кода (теперь он печатает хиты в новой строке, но без информации о столбце1, и оставляет пустую строку после того, как она переключается на следующий элемент). – Hixon

+0

Измените свой вопрос, чтобы включить хотя бы некоторые примеры данных с несколькими покажет желаемый результат. – jas