2番目の列から隣接するすべての行を減算して最初の列を維持する方法

2番目の列から隣接するすべての行を減算して最初の列を維持する方法

次のコマンドを使用してファイルを生成します。

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 " " "" }'

出力は次のとおりです。

    Name 0
WRAP53 0.08495288 
NHP2 0.17606254 
POLA1 0.25320756 
POLD3 0.32372433 
PRIM1 0.38140765 
RFC5 0.44302294 
POLD1 0.497649 
...

2番目の列から隣接する各行を減算し、次の結果を提供するコマンドが必要です。

WRAP53 0.0849529 
NHP2 0.0911097 
POLA1 0.077145 
POLD3 0.0705168 
PRIM1 0.0576833 
RFC5 0.0616153 
POLD1 0.0546261 
...

2番目の列だけを維持すると、どうすればよいかを知っています。次のようになります。

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 ファイルは次のとおりです。

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 に書き込めばよいでしょう。

答え1

完全なawkパイプラインは次のように置き換えることができます。

awk 'NR > 1 && $8 != "No" {print $2, $7 - prev} {prev = $7}' REACTOME_EXTENSION_OF_TELOMERES.xls

どの出力

WRAP53 0.0849529
NHP2 0.0911097
POLA1 0.077145
POLD3 0.0705168
PRIM1 0.0576833
RFC5 0.0616153
POLD1 0.0546261

答え2

$ 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プログラムには以下の説明が含まれています。

# 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
}

出力を新しいファイル名にリダイレクトして保存します。

awk '...as above...' inputfile >outputfile

関連情報