Уникальный список узлов в пограничном списке - PullRequest
0 голосов
/ 13 ноября 2018

У меня большой список ребер (~ 26 миллионов) с первыми двумя столбцами в качестве узлов и с переменным числом необязательных столбцов:

Node1    Node2    OptionalCol1    OptionalCol2   ...

Gene A    Gene D   --             --
Gene C    Gene F   --             --
Gene D    Gene C   --             --
Gene F    Gene A   --             --

Мне нужен текстовый файл, который будет иметь не избыточный список узлов, объединяющих оба столбцы.Вывод:

Gene A
Gene D
Gene C
Gene F

Мой код Python:

file1 = open("input.txt", "r")
node_id = file1.readlines()
node_list=[]

for i in node_id:
    node_info=i.split()
    node_info[0]=node_info[0].strip()
    node_info[1]=node_info[1].strip()
    if node_info[0] not in node_list:
        node_list.append(node_info[0])
    if node_info[1] not in node_list:
        node_list.append(node_info[1])

print node_list

Возможно ли это сделать с помощью awk?Спасибо

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

использовать set() в python примерно так:

file1=open("input.txt",'r')

lines = file1.read().split('\n')

all_nodes_as_string=' '.join(lines) #you can use '\t' here if that's what sepparates the nodes on each line

all_nodes_with_dupes = all_nodes_as_string.split(' ')

all_unique_nodes = set(all_nodes_with_dupes)
0 голосов
/ 13 ноября 2018

Если ваш файл разделен вкладками, вы можете использовать это, но вы можете изменить параметр sep на любой разделитель.

import pandas as pd
import numpy as np

df = pd.read_csv('input.txt', sep='\t', usecols=['Node1', 'Node2'])
node_list = np.concatenate((df['Node1'].unique(), df['Node2'].unique()))

При работе с реляционными данными, такими как выглядит ваш файл, pandas - очень полезный и быстрый инструмент, который вы можете использовать.

0 голосов
/ 13 ноября 2018

Предполагается, что разделитель является вкладкой (\t).Если это кучка пробелов (куча больше одного) вместо -F"\t", используйте: -F" +":

$ awk -F"\t" 'NR>2{a[$1];a[$2]}END{for(i in a)print i}' file
Gene A
Gene C
Gene D
Gene F

Вывод не в каком-то определенном порядке, но это может быть.Объяснил:

$ awk -F"\t" '
NR>2 {           # starting on the third record
    a[$1]        # hash first...
    a[$2]        # and second columns
}
END {            # after all that hashing
    for(i in a)  # iterate whole hash
        print i  # and output
}' file
0 голосов
/ 13 ноября 2018

Вы можете объединить awk с уникальным видом сортировки:

$ awk '/Gene/ {print $1, $2; print $3, $4}' file | sort -u
Gene A
Gene C
Gene D
Gene F

Или, если столбцы разделены табуляцией:

$ awk -F'\t' '/Gene/ {print $1; print $2}' file | sort -u
Gene A
Gene C
Gene D
Gene F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...