2015-06-17 6 views
5

Я пытался определить способ выбора строк, которые уникальны на основе значений двух столбцов. Например, вот пример/пример моего файла:Выбор уникальных строк на основе двух столбцов

chr1 10 12 
chr1 10 12 
chr1 10 11 
chr1 9 12 
chr2 15 20 

И это то, что я хочу, чтобы мой выход выглядеть следующим образом:

chr1 10 12 
chr1 10 11 
chr1 9 12 
chr2 15 20 

Я пытался использовать этот код, потому что мне нравится как это не путается с порядком моего файла:

awk -F"\t" '!_[$2]++' SNP_positions.txt > SNP_positions_uniq.txt 

Однако он отображает только уникальные особенности одной колонки. Есть ли способ редактировать это, чтобы заставить его работать для двух столбцов?

+0

вы упоминаете два столбца, но в вашем файле три. Какие из них следует учитывать? Приведите более общий пример, если это возможно. Ваш текущий подход работает для данного файла, поэтому может быть что-то еще. – fedorqui

+0

Я хочу найти строки, которые имеют уникальные значения в обоих столбцах два и три. Если бы я использовал код выше, мой вывод не дал бы мне 3-ей строки на моем выходе (chr1 122332 130204). Я отредактирую, чтобы сделать его более простым. – cosmictypist

+0

Тот, кто сказал вам использовать '_' в качестве имени переменной, является идиотом, не слушайте их больше. Мы все знаем, что имена однобуквенных переменных лучше избегать вообще, поскольку они ничего не делают, чтобы улучшить ясность вашего кода, но использование чего-то, что даже не письмо, просто смешно. –

ответ

10

Вы можете прекрасно использовать индекс, который использует более одного поля для элементов массива:

awk -F"\t" '!seen[$2, $3]++' file 

В этом случае мы используем $2, $3 как индекс. Таким образом, мы получим все разные элементы кортежей ($2, $3).

+0

Если бы я хотел использовать это для всех трех столбцов, код выглядел бы следующим образом: 'awk -F" \ t "'! uniq [$ 1 FS $ 3] ++' file' или' awk -F ' \ t "'! uniq [$ 1 FS $ 2 FS $ 3] ++' file'' – cosmictypist

+0

@ christylynn002 Если вы хотите использовать полную строку, быстрее сказать' uniq [$ 0] '. Если вы хотите еще три раза, 'uniq [$ 1 FS $ 2 FS $ 3]'. Обратите внимание, что мы используем 'FS' для предотвращения того, чтобы' 2 \ tab3' соответствовала строке '2 3'. – fedorqui

+0

Ах, отлично. Спасибо! Думаю, я наконец понял это. – cosmictypist

1

awk решение обеспечило большой и быстрый, но я пришел сюда сам искал sort решение, которое, вероятно, медленнее, почти во всех случаях:

cat file | sort -u -k1,1 -k2,2 -k3,3 -s 

Я нашел ответ здесь: https://stackoverflow.com/a/12546627/778533