Awk для обновления файла на основе соответствия и условия в другом - PullRequest
0 голосов
/ 23 ноября 2018

Приведенное ниже значение awk даст tab-delimeted file1 с разницей между $3-$2, рассчитанной для каждой строки и напечатанной в $6.Перед выполнением awk существует только 5 полей.

Какие у меня проблемы с обновлением каждого значения $2 в file2 со значением $7 file1, если значение $1file2 соответствует $5 file1, а $6 в file1 не intron.Если значение $5 равно intron, то значение $7 в file1 равно нулю.Так, например, строка 1 в file1 равна intron, так что эквивалентна нулю или пропущена (эти строки не нужны в расчете).

Возможно, значение $1 в file2 может не существовать в file1, и в этом случае значение $2 в file2 равно нулю.Строка 3 в file2 является примером и установлена ​​в ноль, потому что она не существует в file1.Спасибо:).

Awk с выводом

awk '
  FNR==NR{                 # process same line
     b[$4]=$3-$2;
     next  # process next line
}
{
 a[$5]+=($3-$2)
}
{
  split($1, b, " "); print b[0], a[b[0]]
}' OFS="\t" file1 file2

Вывод

-2135
-2135
-2222
-2351
-2351
-2414

File1 tab-delimited

chr5    86667863    86667879    RASA1   intron  16
chr5    86669977    86669995    RASA1   splicing    18
chr5    86670703    86670805    RASA1   exon    102
chr5    86679453    86679547    RASA1   intron  94
chr5    86679571    86679673    RASA1   exon    102
chr19   15088950    15088961    NOTCH2  intron  50
chr19   15288950    15288961    NOTCH3  intron  11
chr19   15308240    15308275    NOTCH3  exon    35

Файл2 space delimited

RASA1 2135
NOTCH2 0
GIMAP8 87
NOTCH3 129
FOXF2 0
PRB3 63

Желаемый after file2 is updated

RASA1 222  `(102+102+18)`
NOTCH2 0
GIMAP8 0
NOTCH3 35  `(35)`
FOXF2 0
PRB3 0

Возможно добавление | после первого awk с помощью:

awk 'FNR==NR { a[$1]=$7; next } { if(a[$5]){$1=a[$5] }; print }'

Для обновления file2

Ответы [ 2 ]

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

Не могли бы вы попробовать следующее.Он предоставит вам последовательность вывода в том же порядке, что и в файле Input_file.

awk '
FNR==NR{
  if(!b[$1]++){
     c[++count]=$1
  }
  a[$1]
  next
}
($4 in a) && $5!="intron"{
  a[$4]+=$NF
}
END{
  for(i=1;i<=count;i++){
    print c[i],a[c[i]]?a[c[i]]:0
  }
}'  Input_file2   Input_file1 

Поскольку ваш файл Input_file1 НЕ разделен символом TAB в соответствии с вашей заявкой, поэтому в случае его изменения отредактируйте Input_file2 Input_file1 -----> Input_file2 FS="\t" Input_file1.Чтобы получить выходные данные с разделителями TAB, либо добавьте приведенный выше вывод кода к команде | column -t, либо установите OFS="\t" рядом с FS="\t".

Вывод будет следующим:

RASA1 222
NOTCH2 0
GIMAP8 0
NOTCH3 35
FOXF2 0
PRB3 0
0 голосов
/ 24 ноября 2018

если я правильно понял, это должно делать то, что вы ожидаете

$ awk 'FNR==NR && $5!="intron" {a[$4]+=$3-$2; next}
       {$2=($1 in a)?a[$1]:0}1' file1 file2 > file2.updated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...