2017-02-10 4 views
0

Я знаю, как это сделать в R, но, к сожалению, мой набор данных слишком велик, поэтому я пытаюсь использовать оболочку для преобразования набора данных из длинного формата в широкий формат.unix конвертировать длинный в широкий

текущий формат что-то вроде этого:

Name1 A 3 
Name2 A 6 
Name3 A 10 
Name3 B 2 
Name4 A 4 
Name5 B 1 

Я хотел бы превратить его в широком формате, так что второй столбец становится новые столбцы и третий столбец становится отсчеты. Если нет Вейл, я хочу, чтобы вставить 0 в своем месте, как это:

Name A B 
Name1 3 0 
Name2 6 0 
Name3 10 2 
Name4 4 0 
Name5 0 1 

С моим ограниченным знанием Linux и моих онлайновых поисков я действительно не знаю, как подойти к этому.

Одна вещь, которую я попытался обойти эту проблему, состоит в том, чтобы подмножить файл на два отдельных файла, используя grep, а затем попробуйте длинное соединение.

grep A file | sort -k 1 > file_A 
grep B file | sort -k 1 > file_B 
join -o '0,1.2,1.3,2.2,2.3' -e "0" -a1 -a2 <(sort -k 1 file_A) <(sort -k 1 file_B) > output 

это появляется работать, если я просто запустить команду присоединиться. Однако, когда я пытаюсь направить вывод в файл, я получаю следующее сообщение об ошибке:

join: /dev/fd/63:63: is not sorted: Name4 A 83 
join: /dev/fd/62:15: is not sorted: Name5 B 3 

Все, что я прочитал в Интернете показывает, что, когда файлы не отсортирован эта ошибка появляется, но я на самом деле думаю, Я сортирую их по столбцу 1 дважды.

Любые мысли о лучшем способе перехода от широкого до длинного формата или о том, как устранить мою попытку составить сводную таблицу, будут высоко оценены. Спасибо.

ответ

2

Это больше инструмент для , нежели join. Вы хотите иметь 2-мерную структуру данных для хранения информации. Я использую GNU awk для перебора ключей массива в отсортированном порядке.

gawk ' 
    {val[$1][$2] = $3} 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" 
     print "NAME A B" 
     for (name in val) 
      print name, 0+val[name]["A"], 0+val[name]["B"] 
    } 
' file 

Я добавляю значение до нуля, так что этот переменные не установлены элементы массива рассматривается как номер ноля вместо пустой строки.

+0

Большое вам спасибо! Я никогда раньше не использовал gawk, но этот скрипт работает отлично! Использование join было моей град-мариной попыткой попытаться мыслить творчески, используя команды, с которыми мне было удобно, но это решение gawk намного, намного лучше! – user4670961

Смежные вопросы