2016-11-27 5 views
2

У меня есть список с 20000 пробниками, есть ли способ извлечь первые три строки/вхождения для каждого зонда с помощью sed/awk?Использование Sed/Awk для извлечения первых трех уникальных экземпляров строки

Example of dataset: 
    Probe1 A GTTAGAGGAGGTGGAAGAGC 
    Probe1 B CTGAGGTCGGGACGGAGCAC 
    Probe1 C GATGTAGGCGGTTGGCGTGG 
    Probe1 D GTTGGCGAAGTCACATCTAG 
    Probe1 E CATGTCGCCGACTCCGTCGA 
    Probe1 F GTGATGTTCTGAGTACATAG 

    Probe3 A GATTGTAGGTTTCCTGCCAG 
    Probe3 L ACCCAGCCAGGGGAAAACCA 
    Probe3 Z GGAGATGTAGGCGGTTGGCG 
    Probe3 Y GGAGATGTAGGCCTTAAAAA 
    Probe3 D GATTGTAGGGGTCCTGCCAG 

Желаемый результат:

Probe1 A GTTAGAGGAGGTGGAAGAGC 
Probe1 B CTGAGGTCGGGACGGAGCAC 
Probe1 C GATGTAGGCGGTTGGCGTGG 
Probe3 A GATTGTAGGTTTCCTGCCAG 
Probe3 L ACCCAGCCAGGGGAAAACCA 
Probe3 Z GGAGATGTAGGCGGTTGGCG 

ответ

5

awk на помощь!

$ awk '++a[$1]<4' file 

удалить пустые строки

$ awk '++a[$1]<4 && NF' file 
+2

Так просто и элегантно. Спасибо. Только одно: можете ли вы объяснить ++ часть? – Bio21

+0

Ницца. '++ a [$ 1]' увеличивает значение, связанное с уникальными значениями в первом поле. Линия печатается при менее чем 4. – dawg

0

Нет необходимости использовать СЭД или AWK (если вы не хотите использовать Python). Если я не ошибаюсь ваш вопрос, это должно сделать это:

probes = [ 
"""Probe1 A GTTAGAGGAGGTGGAAGAGC 
Probe1 B CTGAGGTCGGGACGGAGCAC 
Probe1 C GATGTAGGCGGTTGGCGTGG 
Probe1 D GTTGGCGAAGTCACATCTAG 
Probe1 E CATGTCGCCGACTCCGTCGA 
Probe1 F GTGATGTTCTGAGTACATAG""", 
"""Probe3 A GATTGTAGGTTTCCTGCCAG 
Probe3 L ACCCAGCCAGGGGAAAACCA 
Probe3 Z GGAGATGTAGGCGGTTGGCG 
Probe3 Y GGAGATGTAGGCCTTAAAAA 
Probe3 D GATTGTAGGGGTCCTGCCAG"""] 

for probe in probes: 
    for i, line in enumerate(probe.split("\n")): 
     print(line) 
     if i >= 2: 
      break 
+0

Спасибо вам, оба варианта работали отлично – Bio21

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