Arhn - архитектура программирования

вывести группу столбцов другой оболочкой столбца

У меня есть файл path.text. Столбцы разделяются символом "\t".
Первый и второй столбцы имеют вид:

Y123W    AB - CD - ED    ...  
Y948W    ED - WG - SG -EG  ...  
Y9368    AB - UE  ...  
Y024W    AB - UE  ...  
YOWB3    AB - CD - ED  ...  
...

Я хочу вывести элементы в первой группе столбцов уникальными элементами во втором столбце. Должно быть так (формат не имеет значения):

AB - CD - ED:
Y123W, YOWB3, ...
AB - UE:
Y9368, Y024W, ...
ED - WG - SG -EG:
Y948W, ...
...

Сначала я попытался прочитать второй столбец в массиве:

pathways=( $(awk -F"\t" '{print $2}' pathway.txt) )

Затем я попытался отсортировать пути, чтобы получить уникальные пути:

uniq=($(printf "%s\n" "${pathways[@]}" | sort -u))

Однако, возможно, из-за того, что элементы второго столбца содержат пробелы " ", массив uniq, который я получил, был в беспорядке.

echo "${uniq[@]}" 

Вывод такой:

AB AB AB AB CD CD ...

Я новичок в оболочке. Поэтому я просто попытался добиться этого шаг за шагом, используя Python или R... Пожалуйста, помогите! Большое спасибо

08.12.2017

  • каково общее количество столбцов? как должны быть сгруппированы остальные столбцы? 09.12.2017
  • Около 200 столбцов. Предполагается, что белки (первая колонка) сгруппированы по соответствующим путям (вторая колонка). @РоманПерехрест 09.12.2017

Ответы:


1

Пытаться:

$ awk -F'\t' '{if ($2 in a) a[$2]=a[$2]", "$1; else a[$2]=$2":\n"$1} END{for (x in a)print a[x]}' file
AB - UE:
Y9368, Y024W
ED - WG - SG -EG:
Y948W
AB - CD - ED:
Y123W, YOWB3

Как это работает

  • -F'\t'

    Это устанавливает разделитель полей на табуляцию.

  • if ($2 in a) a[$2]=a[$2]", "$1; else a[$2]=$2":\n"$1

    Если второе поле уже находится в массиве a, добавьте к текущему полю 1. Если это не так, начните новую запись в a.

  • END{for (x in a)print a[x]}

    После того, как мы прочитали весь входной файл, распечатайте результаты.

Альтернатива

В этой версии вместо оператора if-else используется тернарный оператор.

$ awk -F'\t' '{a[$2]=a[$2](a[$2]?", "$1:$1)} END{for (x in a)printf "%s:\n%s\n",x,a[x]}' file
AB - UE:
Y9368, Y024W
ED - WG - SG -EG:
Y948W
AB - CD - ED:
Y123W, YOWB3
08.12.2017
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..