print first 8 columns and one of the last three non-zero columns

print first 8 columns and one of the last three non-zero columns linux/awk/sed/R – StackOverflow

最後の3つの列は1つがnon-zero valuesで他2つはzeroであると仮定できる場合,
単に最後の3列を足し合わせれば良い.

%%bash
time {
echo """chr2    219541089   C   15  0   12  0   3   0   0   20
chr20   31831068    C   48  3   45  0   0   6.25    0   0
chr20   38724789    C   41  4   37  0   0   9.7561  0   0
chr20   63080141    C   95  0   91  4   0   0   4.21053 0
chr22   37642528    C   31  2   29  0   0   6.45161 0   0""" |
awk '{$(NF-2)+=$(NF-1)+$NF;$(NF-1)=$NF=""}1'
}
chr2 219541089 C 15 0 12 0 3 20  
chr20 31831068 C 48 3 45 0 0 6.25  
chr20 38724789 C 41 4 37 0 0 9.7561  
chr20 63080141 C 95 0 91 4 0 4.21053  
chr22 37642528 C 31 2 29 0 0 6.45161  

real    0m0.004s
user    0m0.001s
sys 0m0.003s

そうじゃない場合は,0をNaNにしてフィルした後,最初の列だけ選択する.

import io
import pandas as pd
import numpy as np


strings = """chr2    219541089   C   15  0   12  0   3   0   0   20
chr20   31831068    C   48  3   45  0   0   6.25    0   0
chr20   38724789    C   41  4   37  0   0   9.7561  0   0
chr20   63080141    C   95  0   91  4   0   0   4.21053 0
chr22   37642528    C   31  2   29  0   0   6.45161 0   0"""

df = pd.read_csv(io.StringIO(strings), sep='\s+', header=None)
df.loc[:, 8:10] = df.loc[:, 8:10].replace(0, np.nan).bfill(1)
df.loc[:, 0:8]
    0           1       2   3   4   5   6   7   8
0   chr2    219541089   C   15  0   12  0   3   20.00000
1   chr20   31831068    C   48  3   45  0   0   6.25000
2   chr20   38724789    C   41  4   37  0   0   9.75610
3   chr20   63080141    C   95  0   91  4   0   4.21053
4   chr22   37642528    C   31  2   29  0   0   6.45161

同様にawkで考えると,

%%bash
time {
echo """chr2    219541089   C   15  0   12  0   3   0   0   20
chr20   31831068    C   48  3   45  0   0   6.25    0   0
chr20   38724789    C   41  4   37  0   0   9.7561  0   0
chr20   63080141    C   95  0   91  4   0   0   4.21053 0
chr22   37642528    C   31  2   29  0   0   6.45161 0   0""" |
awk '
{f=0;for(i=NF-2;i<=NF;i++){$i=(f==0 ? nonzero($i) : "");if($i)f=1}}1
function nonzero(x) {return (x!=0 ? x : "")}
'
}
chr2 219541089 C 15 0 12 0 3   20
chr20 31831068 C 48 3 45 0 0 6.25  
chr20 38724789 C 41 4 37 0 0 9.7561  
chr20 63080141 C 95 0 91 4 0  4.21053 
chr22 37642528 C 31 2 29 0 0 6.45161  

real    0m0.006s
user    0m0.003s
sys 0m0.003s
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください