bash script para classificar arquivos com base na classificação da coluna

1

Sou iniciante na plataforma Unix. Estou tentando classificar o arquivo com base no sinal do log2FoldChange multiplicado pelo inverso do pvalue .

arquivo de entrada =

  Gene  baseMean    log2FoldChange  lfcSE   stat    pvalue  padj
ABCA13  5103.080785 2.543103478 0.438305758 5.802121998 6.55E-09    1.93E-07
ABCA3   18680.58642 -1.553638598    0.460873937 -3.371070638    0.000748767 0.003440638
ABCC1   25566.61312 1.835232419 0.297965004 6.15922137  7.31E-10    2.95E-08
ABCC2   200.351079  1.753257763 0.47254475  3.710247045 0.000207057 0.001190344
ABCC5   18904.8957  2.982575702 0.304484366 9.795497012 1.18E-22    7.21E-20
ABCC6   1071.195985 -1.858889875    0.388613973 -4.783384034    1.72E-06    2.16E-05
ABCC6P1 121.4678884 -2.319956403    0.367695124 -6.309456544    2.80E-10    1.26E-08
ABCC6P2 154.2820927 -2.402177208    0.393773373 -6.100405397    1.06E-09    4.06E-08
ABCC8   71.94941328 -1.651659127    0.494666609 -3.338933936    0.000841006 0.003782183
#!/bin/bash
DGE=$1
RNK='echo $DGE | sed 's/.txt/.rnk/''
sed 1d $DGE \
| sort -k6g \
| awk '!arr[$1]++' \
| awk '{OFS="\t"}
{ if ($3>0) printf "%s\t%4.3e\n", $1, 1/$7 ;
else printf "%s\t%4.3e\n", $1, -1/$7 }' \
| sort -k2gr > $RNK

Mas estou recebendo um arquivo vazio como saída

    
por r.bot 02.12.2015 / 11:15

2 respostas

0

com awk :

awk 'NR!=1{$0=$0" "$3*(1/$6)}1' file | sort -k8,8g
  • NR!=1 ignora a linha do cabeçalho.
  • $0=$0" "$3*(1/$6) : adiciona um oitavo campo com o resultado desejado.
  • {...}1 1 é uma condição positiva, que awk imprime a linha.
  • sort -k8,8g classifica o oitavo campo.
  • Além disso, adicione outro canal com ... | awk '{$8=""}1' para remover esse campo novamente, se desejar.

Editar : em seu código na pergunta, vejo que você deseja um resultado positivo (se o valor em $3 for negativo, ele deverá ser -1/$7 ). Apoiando isso, aqui meu comando mudou:

awk 'NR!=1{$0=$0" "sqrt(($3*(1/$6))^2)}1' file | sort -k8,8g

Eu fiz um pouco diferente; Eu fiz um quadrado e, em seguida, peguei a raiz do sqaure.

    
por 02.12.2015 / 11:34
0

Perl para o resgate:

perl -walne 'print,next if 1 == $.;
             print $F[2] * $F[5], " $_" ' < file | sort -g

Se você pudesse descrever o que quis dizer com "sinal", eu poderia incorporá-lo ao script.

    
por 02.12.2015 / 11:24

Tags