2015-05-14 4 views
2

У меня есть файл с разделителями табуляции с некоторыми дублируемыми строками. Меня интересует поиск строк с дубликатами во втором поле (позиция), а затем сохранение только строки с наивысшим значением в третьем поле (качество). Например, если файл выглядит, как показано ниже:Bash сортировать на основе одного поля и сравнивать на основе другого поля

chrom 1677 800 
chrom 1677 850 
chrom 1777 900 
chrom 1799 900 

Я заинтересован в сохранении только одну строку для каждой позиции, которая представляет собой самое высокое качество:

chrom 1677 850 
chrom 1777 900 
chrom 1799 900 

я могу найти дублированные позиции с : awk 'seen [$ 2] ++' file.txt

Но я не уверен, как сравнивать дублированные строки со вторым полем на основе значения в третьем поле. Любая помощь будет принята с благодарностью!

Спасибо!

+0

Вы, вероятно, следует [форматировать данных] (http://stackoverflow.com/editing-help#syntax-highlighting) в ваш вопрос для ясности. – lxe

ответ

1
mydir$ echo $'chrom\t1677\t800\nchrom\t1677\t850\nchrom\t1779\t900\nchrom\t1777\t900' > tmp.txt 
mydir$ cat tmp.txt 
chrom 1677 800 
chrom 1677 850 
chrom 1779 900 
chrom 1777 900 
mydir$ sort -t$'\t' -k2,2 -k3,3nr tmp.txt | awk -v FS='\t' 'val!=$2 {val=$2;print}' 
chrom 1677 850 
chrom 1777 900 
chrom 1779 900 
1

Дано:

$ echo "$e" 
chrom 1677 800 
chrom 1677 850 
chrom 1777 900 
chrom 1799 900 

Вы можете сделать:

$ echo "$e" | awk '{if (m[$2]<$3) {m[$2]=$3; seen[$2]=$0}} 
        END {for (e in seen) print seen[e]}' 
chrom 1677 850 
chrom 1777 900 
chrom 1799 900 

Если файл вкладка отделили и действительно файл:

awk -F $'\t' '{if (m[$2]<$3) {m[$2]=$3; seen[$2]=$0}} 
       END {for (e in seen) print seen[e]}' file 
Смежные вопросы