首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从第二列减去相邻的每一行并保留第一列

如何从第二列减去相邻的每一行并保留第一列
EN

Unix & Linux用户
提问于 2019-04-22 19:42:25
回答 2查看 276关注 0票数 0

我正在通过以下命令创建一个文件:

代码语言:javascript
复制
awk '{print $2 " "$7" "$8}' REACTOME_EXTENSION_OF_TELOMERES.xls |  awk '$8!="No"  {print $1 " " $2}' | awk 'NR>1' | awk 'BEGIN { OFS=", "; print "Name" " " "0" };{ print $0 " " "" }'

产出如下:

代码语言:javascript
复制
    Name 0
WRAP53 0.08495288 
NHP2 0.17606254 
POLA1 0.25320756 
POLD3 0.32372433 
PRIM1 0.38140765 
RFC5 0.44302294 
POLD1 0.497649 
...

我需要一个命令,在第二列中减去每一行相邻的行,并给出结果:

代码语言:javascript
复制
WRAP53 0.0849529 
NHP2 0.0911097 
POLA1 0.077145 
POLD3 0.0705168 
PRIM1 0.0576833 
RFC5 0.0616153 
POLD1 0.0546261 
...

当我保留第二栏的时候,我知道怎么做,它会是这样的:

代码语言:javascript
复制
awk '{print $2 " "$7" "$8}' REACTOME_EXTENSION_OF_TELOMERES.xls |  awk '$8!="No"  {print $1 " " $2}' | awk 'NR>1' | awk 'BEGIN { OFS=", "; print "Name" " " "0" };{ print $0 " " "" }' | awk '{print $NF}' | awk 'NR-1{print $0-p}{p=$0}'

但是,如何做到这一点,使我保留第一列,如上文所示?

REACTOME_EXTENSION_OF_TELOMERES.xls文件如下所示:

代码语言:javascript
复制
NAME    PROBE   GENE SYMBOL     GENE_TITLE      RANK IN GENE LIST       RANK METRIC SCORE       RUNNING ES      CORE ENRICHMENT
row_0   WRAP53  null    null    163     1.5818238258361816      0.08495288      Yes
row_1   NHP2    null    null    201     1.5055444240570068      0.17606254      Yes
row_2   POLA1   null    null    283     1.3435969352722168      0.25320756      Yes
row_3   POLD3   null    null    367     1.240567684173584       0.32372433      Yes
row_4   PRIM1   null    null    501     1.1049883365631104      0.38140765      Yes
row_5   RFC5    null    null    557     1.0596935749053955      0.44302294      Yes
row_6   POLD1   null    null    653     1.0035457611083984      0.497649        Yes

如果我可以将整个命令的输出输入: REACTOME_EXTENSION_OF_TELOMERES.y,那就太好了。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-04-23 14:30:11

您的整个awk管道可以由

代码语言:javascript
复制
awk 'NR > 1 && $8 != "No" {print $2, $7 - prev} {prev = $7}' REACTOME_EXTENSION_OF_TELOMERES.xls

哪种输出

代码语言:javascript
复制
WRAP53 0.0849529
NHP2 0.0911097
POLA1 0.077145
POLD3 0.0705168
PRIM1 0.0576833
RFC5 0.0616153
POLD1 0.0546261
票数 1
EN

Unix & Linux用户

发布于 2019-04-22 20:16:47

代码语言:javascript
复制
$ awk 'BEGIN { OFS=FS } $8 == "No" { next } { tmp = $7 } NR > 2 { $7 -= prev } { prev = tmp; print }' inputfile
NAME    PROBE   GENE SYMBOL     GENE_TITLE      RANK IN GENE LIST       RANK METRIC SCORE       RUNNING ES      CORE ENRICHMENT
row_0   WRAP53  null    null    163     1.5818238258361816      0.08495288      Yes
row_1   NHP2    null    null    201     1.5055444240570068      0.0911097       Yes
row_2   POLA1   null    null    283     1.3435969352722168      0.077145        Yes
row_3   POLD3   null    null    367     1.240567684173584       0.0705168       Yes
row_4   PRIM1   null    null    501     1.1049883365631104      0.0576833       Yes
row_5   RFC5    null    null    557     1.0596935749053955      0.0616153       Yes
row_6   POLD1   null    null    653     1.0035457611083984      0.0546261       Yes

awk程序,注释为:

代码语言:javascript
复制
# Set output delimiter to input delimiter (tab, set with -F)
BEGIN { OFS = FS }

# Skip lines whose 8th column is "No"
$8 == "No" { next }  # or { exit } if "No"-lines are sorted at the end.

# Save the original value in column 7.
{ tmp = $7 }

# For any row past both the header and the first data line,
# decrease column 7 by the previous row's column 7 value.
NR > 2 { $7 -= prev }

# Remember the current row's original column 7 value
# in prev and print the (possibly) modified row.
{
    prev = tmp
    print
}

将输出重定向到一个新的文件名以存储它:

代码语言:javascript
复制
awk '...as above...' inputfile >outputfile
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/513881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档