搜索
查看: 2468|回复: 7

把多行文本文件提炼出矩阵来

[复制链接]

633

主题

1189

帖子

4054

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4054
发表于 2017-1-20 21:49:27 | 显示全部楼层 |阅读模式
文本如下: [mw_shl_code=applescript,true]sample_1tmp
1/2        746.79885611041
0/1        1225.50115276607
1/1        759.071810354618
sample_5tmp
1/2        900.927324912163
0/1        660.024458793714
1/1        558.426841346882
sample_9tmp
1/2        204.433573494494
0/1        1042.62912037971
1/1        993.704566162671
sample_13tmp
1/2        974.91579121466
0/1        779.689739640221
1/1        609.917389489452
sample_17tmp
1/2        91.0116337986804
0/1        1210.91546537882
1/1        476.255905390353
sample_21tmp
1/2        47.6027686520148
0/1        558.733924489047
1/1        584.645860584503
sample_25tmp
1/2        1004.02055076584
0/1        1220.0863859254
1/1        735.795388886856
sample_29tmp
1/2        830.736237245905
0/1        658.623872785571
1/1        1009.60450831672
sample_33tmp
1/2        598.019019343045
0/1        1251.44455356603
1/1        816.342622922422
sample_37tmp
1/2        898.629845945196
0/1        754.640545273077
1/1        1164.1174350349
sample_41tmp
1/2        638.385134307115
0/1        710.04963979081
1/1        397.727806438245
sample_45tmp
1/2        608.528399414268
0/1        1430.5679913929
1/1        404.644620934267
sample_49tmp
1/2        867.427284320426
0/1        1396.78860638913
1/1        565.11901867102
sample_53tmp
1/2        193.09620678225
0/1        1348.60090384919
1/1        1119.75917279476
sample_57tmp
1/2        111.300758435145
0/1        1406.41595626576
1/1        966.816150601536
sample_61tmp
1/2        478.533651213055
0/1        1454.36968303238
1/1        1265.11040389989
sample_65tmp
1/2        124.818594737002
0/1        1021.45517427251
1/1        1228.89935700916
sample_69tmp
1/2        204.979994399979
0/1        498.680884854897
1/1        711.761581683946
sample_73tmp
1/2        111.645941562373
0/1        829.242007761962
1/1        965.043985165284
sample_77tmp
1/2        501.415134397158
0/1        1143.99213023911
1/1        1162.32816183392
sample_81tmp
1/2        974.627690351817
0/1        662.697742773785
1/1        1282.76613339302
sample_85tmp
1/2        447.527067931202
0/1        724.996076772046
1/1        974.089555837438
sample_89tmp
1/2        384.216002000898
0/1        895.533957479052
1/1        1242.05234868965
sample_93tmp
1/2        815.77483898459
0/1        656.571711570146
1/1        607.474156504781
sample_97tmp
1/2        544.664326563154
0/1        727.435870518115
1/1        472.518326525783
sample_101tmp
1/2        500.246722545386
0/1        1080.06941352693
1/1        477.02967550022
sample_105tmp
1/2        440.728547155379
0/1        804.879537687127
1/1        1324.28407859302
sample_109tmp
1/2        342.845351212455
0/1        504.182317410788
1/1        875.411034510101
sample_113tmp
1/2        433.780523275979
0/1        1088.78808445781
1/1        523.280255117605
sample_117tmp
1/2        179.655681173796
0/1        1056.4500647981
1/1        848.631279543408
sample_121tmp
0/1        1343.80676892645
1/1        349.734430248701
sample_124tmp
1/2        998.731686268739
0/1        1401.64706954199
1/1        1095.81316115466
sample_128tmp
1/2        720.746605674494
0/1        863.252984748898
1/1        973.919434846593
sample_132tmp
1/2        951.791095012577
0/1        738.340225906919
1/1        682.042204411297
sample_136tmp
1/2        870.739764604892
0/1        1162.53784108579
1/1        795.742601403389
sample_140tmp
1/2        112.081986585957
0/1        709.383530848235
1/1        662.447023852572
sample_144tmp
1/2        773.206263591473
0/1        588.570713842847
1/1        1015.4953645153
sample_148tmp
1/2        555.287476955552
0/1        687.595942864831
1/1        1091.74368390567
sample_152tmp
1/2        729.119789611161
0/1        954.67859841706
1/1        580.404477457784
sample_156tmp
1/2        482.616633614658
0/1        1375.58274893982
1/1        346.378586489772
sample_160tmp
1/2        495.87826576261
0/1        1288.80615586135
1/1        741.056404701994
sample_164tmp
1/2        279.242445867331
0/1        1313.8202342728
1/1        1202.03812590469
sample_168tmp
1/2        321.453082259329
0/1        532.474995044151
1/1        967.309344360869
sample_172tmp
1/2        131.584190245267
0/1        952.645208032657
1/1        1080.92059120928
sample_176tmp
1/2        715.94446603103
0/1        448.300483783472
1/1        1261.87323532382
sample_180tmp
1/2        267.041231686198
0/1        1075.82606812481
1/1        813.939841817291
sample_184tmp
1/2        527.184417329323
0/1        1431.50840308849
1/1        718.495674701954
sample_188tmp
1/2        196.851675046899
0/1        482.068437248754
1/1        870.666843551084
sample_192tmp
1/2        823.249478969295
0/1        876.080190645724
1/1        1189.97290368193
sample_196tmp
1/2        887.340572117003
0/1        1415.04295168686
1/1        817.354583131508
sample_200tmp
1/2        168.569127956019
0/1        784.488435112035
1/1        447.64679294351
sample_204tmp
1/2        962.791997725961
0/1        716.597981127383
1/1        1259.14833462248
sample_208tmp
1/2        816.465217063341
0/1        1169.68829862793
1/1        790.583544662655
sample_212tmp
1/2        185.131551505915
0/1        1228.77439267976
1/1        1230.06076764262
sample_216tmp
1/2        756.010282719586
0/1        538.361467210385
1/1        461.99594619543
sample_220tmp
1/2        686.263627408122
0/1        1061.69413802046
1/1        1358.0398375546
sample_224tmp
1/2        443.526839434547
0/1        1348.77954054076
1/1        547.640850039395
sample_228tmp
1/2        730.538890029702
0/1        1227.76671378768
1/1        555.080793881928
sample_232tmp
1/2        887.902476109592
0/1        922.754216622784
1/1        1066.10601605011
sample_236tmp
1/2        354.26054817176
0/1        900.667125597655
1/1        1126.43202913297
sample_240tmp
1/2        776.176947961126
0/1        859.090130398752
1/1        1363.52385698931
sample_244tmp
1/2        823.650145952831
0/1        695.663574664437
1/1        780.520681279606
sample_248tmp
1/2        748.63610008442
0/1        686.255400821129
1/1        1287.08134942943
sample_252tmp
1/2        947.799356309804
0/1        1401.15941300895
1/1        861.836317617306
sample_256tmp
1/2        465.458925497948
0/1        1194.81952809307
1/1        382.004428917494
sample_260tmp
1/2        755.059193363878
0/1        914.700493353171
1/1        1167.70386270665
sample_264tmp
1/2        57.9500525823227
0/1        1093.3634867298
1/1        1042.11406554501
sample_268tmp
1/2        246.686556189496
0/1        1060.7568950434
1/1        600.66893398614
sample_272tmp
1/2        24.3241939505265
0/1        1289.99923135164
1/1        998.543147628548
sample_276tmp
1/2        150.58742105471
0/1        1137.33560849831
1/1        1029.6818224958
sample_280tmp
1/2        535.116157443951
0/1        1339.47764151126
1/1        1043.29127444242
sample_284tmp
1/2        819.168028815879
0/1        761.679437382584
1/1        770.475278656503
sample_288tmp
1/2        884.513439734294
0/1        908.392408692297
1/1        1102.45828730145
sample_292tmp
1/2        603.446177551595
0/1        819.393447410273
1/1        784.415729340296
sample_296tmp
1/2        23.0341817784703
0/1        1067.84003272924
1/1        646.894482687736
[/mw_shl_code]
很明显,是前面的生信工程师偷懒了,所以给了这样的统计结果。
但是我们要方便浏览呀!
作为一个合格的生信工程师,我们不能盲目的责怪合作伙伴,也不能傻瓜式的用excel解决。
需要变成下面这样

[mw_shl_code=applescript,true]        "1/2"        "0/1"        "1/1"sample_1tmp        759.0718104        746.7988561        1225.501153
sample_5tmp        558.4268413        900.9273249        660.0244588
sample_9tmp        993.7045662        204.4335735        1042.62912
sample_13tmp        609.9173895        974.9157912        779.6897396
sample_17tmp        476.2559054        91.0116338        1210.915465
sample_21tmp        584.6458606        47.60276865        558.7339245
sample_25tmp        735.7953889        1004.020551        1220.086386
sample_29tmp        1009.604508        830.7362372        658.6238728
sample_33tmp        816.3426229        598.0190193        1251.444554
sample_37tmp        1164.117435        898.6298459        754.6405453
sample_41tmp        397.7278064        638.3851343        710.0496398
sample_45tmp        404.6446209        608.5283994        1430.567991
sample_49tmp        565.1190187        867.4272843        1396.788606
sample_53tmp        1119.759173        193.0962068        1348.600904
sample_57tmp        966.8161506        111.3007584        1406.415956
sample_61tmp        1265.110404        478.5336512        1454.369683
sample_65tmp        1228.899357        124.8185947        1021.455174
sample_69tmp        711.7615817        204.9799944        498.6808849
sample_73tmp        965.0439852        111.6459416        829.2420078
sample_77tmp        1162.328162        501.4151344        1143.99213
sample_81tmp        1282.766133        974.6276904        662.6977428
sample_85tmp        974.0895558        447.5270679        724.9960768
sample_89tmp        1242.052349        384.216002        895.5339575
sample_93tmp        607.4741565        815.774839        656.5717116
sample_97tmp        472.5183265        544.6643266        727.4358705
sample_101tmp        477.0296755        500.2467225        1080.069414
sample_105tmp        1324.284079        440.7285472        804.8795377
sample_109tmp        875.4110345        342.8453512        504.1823174
sample_113tmp        523.2802551        433.7805233        1088.788084
sample_117tmp        848.6312795        179.6556812        1056.450065
sample_121tmp        349.7344302        998.7316863        1343.806769
sample_124tmp        1095.813161        720.7466057        1401.64707
sample_128tmp        973.9194348        951.791095        863.2529847
sample_132tmp        682.0422044        870.7397646        738.3402259
sample_136tmp        795.7426014        112.0819866        1162.537841
sample_140tmp        662.4470239        773.2062636        709.3835308
sample_144tmp        1015.495365        555.287477        588.5707138
sample_148tmp        1091.743684        729.1197896        687.5959429
sample_152tmp        580.4044775        482.6166336        954.6785984
sample_156tmp        346.3785865        495.8782658        1375.582749
sample_160tmp        741.0564047        279.2424459        1288.806156
sample_164tmp        1202.038126        321.4530823        1313.820234
sample_168tmp        967.3093444        131.5841902        532.474995
sample_172tmp        1080.920591        715.944466        952.645208
sample_176tmp        1261.873235        267.0412317        448.3004838
sample_180tmp        813.9398418        527.1844173        1075.826068
sample_184tmp        718.4956747        196.851675        1431.508403
sample_188tmp        870.6668436        823.249479        482.0684372
sample_192tmp        1189.972904        887.3405721        876.0801906
sample_196tmp        817.3545831        168.569128        1415.042952
sample_200tmp        447.6467929        962.7919977        784.4884351
sample_204tmp        1259.148335        816.4652171        716.5979811
sample_208tmp        790.5835447        185.1315515        1169.688299
sample_212tmp        1230.060768        756.0102827        1228.774393
sample_216tmp        461.9959462        686.2636274        538.3614672
sample_220tmp        1358.039838        443.5268394        1061.694138
sample_224tmp        547.64085        730.53889        1348.779541
sample_228tmp        555.0807939        887.9024761        1227.766714
sample_232tmp        1066.106016        354.2605482        922.7542166
sample_236tmp        1126.432029        776.176948        900.6671256
sample_240tmp        1363.523857        823.650146        859.0901304
sample_244tmp        780.5206813        748.6361001        695.6635747
sample_248tmp        1287.081349        947.7993563        686.2554008
sample_252tmp        861.8363176        465.4589255        1401.159413
sample_256tmp        382.0044289        755.0591934        1194.819528
sample_260tmp        1167.703863        57.95005258        914.7004934
sample_264tmp        1042.114066        246.6865562        1093.363487
sample_268tmp        600.668934        24.32419395        1060.756895
sample_272tmp        998.5431476        150.5874211        1289.999231
sample_276tmp        1029.681822        535.1161574        1137.335608
sample_280tmp        1043.291274        819.1680288        1339.477642
sample_284tmp        770.4752787        884.5134397        761.6794374
sample_288tmp        1102.458287        603.4461776        908.3924087
sample_292tmp        784.4157293        23.03418178        819.3934474
sample_296tmp        646.8944827                1067.840033


[/mw_shl_code]
这个需求不常见,但是也考验脚本能力!
我的代码如下:
[mw_shl_code=perl,true]
perl -alne '{if (/^sample/){$sample.="$_\t" }else{$counts{$F[0]}.="$F[1]\t"}}END{print $sample;print "$_\t$counts{$_}" foreach keys %counts}' test.txt >stat_test.txt

[/mw_shl_code]







上一篇:TCGA的metadata简介
下一篇:画突变频谱
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复

使用道具 举报

1

主题

15

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2017-1-22 20:50:11 | 显示全部楼层
[mw_shl_code=perl,true]#!/usr/bin/perl
#
my(@sample,@one_two,@z_one,@one_one);
while(<>){
        if(/^(sample\S+)/){
                push @sample,$1;
        }elsif(/^1\/2\s+(\S+)/){
                push @one_two,$1;
        }elsif(/^0\/1\s+(\S+)/){
                push @z_one,$1;
        }elsif(/^1\/1\s+(\S+)/){
                push @one_one,$1;
        }

}
$long=@sample;
print "sample\t1\/2\t0\/1\t1\/1\n";
foreach $i (0..($long-1)){
        print "$sample[$i]\t$one_two[$i]\t$z_one[$i]\t$one_one[$i]\n";
}
[/mw_shl_code]写完不禁感叹 。。什么鬼代码
捕获.PNG
回复 支持 反对

使用道具 举报

1

主题

15

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2017-1-22 20:55:23 | 显示全部楼层
题主单行有bug。。好多列数据对不上
回复 支持 反对

使用道具 举报

633

主题

1189

帖子

4054

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4054
 楼主| 发表于 2017-1-22 21:44:21 | 显示全部楼层
disheng 发表于 2017-1-22 20:55
题主单行有bug。。好多列数据对不上

(⊙o⊙)哦,我的单行是对的,只是数据是错的,这不是原始数据, 我把原始数据修改了,避免泄露人家的项目信息,number也是假的,杂合位点的个数,怎么会有小数呢?你看不出吗
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复 支持 反对

使用道具 举报

1

主题

15

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2017-1-23 13:30:49 | 显示全部楼层
Jimmy 发表于 2017-1-22 21:44
(⊙o⊙)哦,我的单行是对的,只是数据是错的,这不是原始数据, 我把原始数据修改了,避免泄露人家的项目 ...

soga  怪我太年轻 单行看懂了  横着打印的 又自己转置了一下。。
你单行超神了
学习了
回复 支持 反对

使用道具 举报

633

主题

1189

帖子

4054

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4054
 楼主| 发表于 2017-1-23 19:41:54 | 显示全部楼层
disheng 发表于 2017-1-23 13:30
soga  怪我太年轻 单行看懂了  横着打印的 又自己转置了一下。。
你单行超神了
学习了 ...

不客气,分享这些就是让你们学习的,希望有一天可以合作
你这个问题很复杂,需要打赏,请点击 http://www.bio-info-trainee.com/donate 进行打赏,谢谢
回复 支持 反对

使用道具 举报

0

主题

3

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2017-2-23 11:34:48 | 显示全部楼层
[mw_shl_code=python,true]import csv
import pandas as pd
samples = []
one_two = []
zero_one = []
one_one = []

with open('bad.txt','r') as f:
    for line in f:
        line = line.strip()
        if line.startswith('sam'):
            samples.append(line)
        elif line.startswith(r'1/2'):
            one_two.append(line.split(' ')[-1])
        elif line.startswith(r'0/1'):
            zero_one.append(line.split(' ')[-1])
        elif line.startswith(r'1/1'):
            one_one.append(line.split(' ')[-1])
sa = pd.DataFrame(samples)
ot = pd.DataFrame(one_two)
oo = pd.DataFrame(one_one)
zo = pd.DataFrame(zero_one)

final = pd.concat([sa,ot,oo,zo],axis = 1)

with open('output.csv','w') as f:
    headers = ['sample_id','1//2','0//1','1//1']
    final.to_csv(f,header = headers)

f.close() [/mw_shl_code]
回复 支持 反对

使用道具 举报

4

主题

24

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2017-3-4 07:12:54 | 显示全部楼层
本帖最后由 tsznxx 于 2017-3-4 07:39 编辑

用Excel解也还是不错的,如果文件不是那么大的话

假定“1/2,0/1和1/1”的顺序是固定的话。
Shell解法:
(1)把ID和数值做成第二列。sed 's/sample/\tsample/g', sed 's/        /\t/g'
(2)把第二列cut出来,转成1行,再转成4列。cut -f 2 |tr '\n' '\t'|sed 's/sample_/\nsample_/g'
(3)把标题行和上面的输出合并。echo -en "ID\t1/2\t0/1\t1/1"

! [mw_shl_code=shell,true](echo -en "ID\t1/2\t0/1\t1/1";more test.txt|sed 's/sample/\tsample/g' |sed 's/        /\t/g'|cut -f 2 |tr '\n' '\t'|sed 's/sample_/\nsample_/g') >test_out1.txt[/mw_shl_code]

Python解法:思路跟上面差不多。利用的Python的split()函数,会将连续多个的空格识别为1个分隔符。
[mw_shl_code=python,true]with open('test_out.txt','w') as ofh:
    lstr = "ID\t1/2\t0/1\t1/1" # header line
    for line in open("test.txt"):
        if line.startswith('sample'):
            ofh.write(lstr)
            lstr = '\n'+line.rstrip()
        else:
            lstr += '\t'+line.split()[1]
    ofh.write(lstr+'\n')[/mw_shl_code]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2020-3-31 10:16 , Processed in 0.027232 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.