вычтите значения в столбце 1, если столбец 2 совпадает - PullRequest
0 голосов
/ 03 июля 2019

У меня есть файл в следующем формате:

0.019059000     15150000000
0.037088000     15150000000
0.035007000     15150000001
0.047622000     15150000001
0.053359000     15150000002
0.060405000     15150000002
0.068598000     15150000003
0.081587000     15150000003

Я хотел бы вычесть столбец 1, если столбец 2 совпадает.Например, для входного файла я хотел бы иметь что-то вроде этого:

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

Все значения в столбце 2 входного файла идут парами, например, 15150000000 существует только два раза, 15150000001 существует толькодва раза и т. д.

Любая помощь приветствуется!

Ответы [ 3 ]

4 голосов
/ 03 июля 2019

awk на помощь!(без проверки ошибок.)

$ awk 'p==$2 {print $1-pv,p} {p=$2; pv=$1}' file

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

для несортированных, но опять же двойных записей для одного и того же ключа

$ awk '$2 in a {print $1-a[$2],$2; delete a[$2]; next} {a[$2]=$1}' file

0.018029 15150000000
0.012615 15150000001
0.007046 15150000002
0.012989 15150000003

, если второе значение не всегда больше первого и требуется абсолютное значениеразница

$ awk 'function abs(x) {return x<0?-x:x}
       $2 in a {print abs($1-a[$2]),$2; delete a[$2]; next} 
               {a[$2]=$1}' file
1 голос
/ 03 июля 2019

Еще один в awk, вычитает меньше из большего:

$ awk '{
    if($2 in a) {                              # if another $2 already met
        print ((s=$1-a[$2])>0?s:-s),$2         # subtract smaller from bigger
        delete a[$2]                           # delete to save memory
    } else 
        a[$2]=$1                               # else store $2
}' <(shuf file)                                # shuf file to demo random order
                                               # replace with just the file name

Пример вывода (из-за shuf случайности):

0.007046 15150000002
0.018029 15150000000
0.012615 15150000001
0.012989 15150000003
0 голосов
/ 03 июля 2019

Как насчет

awk '{a[$2] = $1 - a[$2]} END {for (b in a) print a[b], b}' file

Ах, я вижу, у вас есть значения в парах .Тогда иди с ответом Каракфы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...