Я знаю, как это сделать в 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 дважды.
Любые мысли о лучшем способе перехода от широкого до длинного формата или о том, как устранить мою попытку составить сводную таблицу, будут высоко оценены. Спасибо.
Большое вам спасибо! Я никогда раньше не использовал gawk, но этот скрипт работает отлично! Использование join было моей град-мариной попыткой попытаться мыслить творчески, используя команды, с которыми мне было удобно, но это решение gawk намного, намного лучше! – user4670961