脚本 | Shell | awk直接根据列名处理数据框

1. awk直接根据列名处理数据框

R中tidyverse处理数据框非常方便,可以根据列名操作相应的列。
awk 总是根据$n来操作第n列,当列数太多怎么办?怎么直接根据列名操作呢?

$ cat b.txt
geneid  T1_1    T1_2    T1_3    T2_1    T2_2    T2_3
gene1   1       3       9       2       8       5
gene2   3       4       5       8       0       8
$ bioawk -t -c header '{print $geneid,$T1_1,$T2_1}' b.txt
geneid  T1_1    T2_1
gene1   1       2
gene2   3       8
  • bioawk还需要下载,我想用awk实现:
$ awk 'BEGIN{OFS="\t"}NR==1{for(i=1;i<=NF;i++){a[$i]=i}}NR>=1{print $a["geneid"],$a["T1_1"],$a["T2_1"]}' b.txt
geneid  T1_1    T2_1
gene1   1       2
gene2   3       8

除了提取列,列的相加等也都可以进行,,,但确实很鸡肋哈,好麻烦。所以,还是学R吧,tidyverseyyds。

2. 如何 pairs 去重?

有了a,b,怎么防止b,a出现?

$ cat d.txt
a b
c a
d b
b d
a c

下面这一行是我写的,在读取每一行时,先判断数组里面有没有正或反的形式,没有则打印,再把这一行放进数组。

$ awk '{if($1"_"$2!=a[$2"_"$1] && $2"_"$1!=a[$2"_"$1])print;a[$1"_"$2]=$1"_"$2}' d.txt
a b
c a
d b

下面这一行是师兄写的,写的太好了,我无论如何写不出来。我只能明白这行代码达到的效果。

$ awk '!(SEEN[$1,$2]++) && !(($2,$1) in SEEN)' d.txt
a b
c a
d b

3. awk求基因表达平均值

  • 一个基因表达矩阵,5个样本,每个样本5个重复,
    每列分别为:geneid,S1_1,S1_2,S1_3,S1_4,S1_5,S2_1,S2_2,S2_3,S2_4,S2_5,......
$ cat a.tpm.tsv
gene1  0.0         0.0         0.0         0.0         0.0         0.039595   0.0         0.000000   0.0        0.0        0.0         0.072418   0.136454    0.0        0.0        125.319084  206.183060  312.973907  1000.064026  535.770325  1111.690186  677.701477  747.069885  1043.504395  587.607422
gene2  153.139114  80.315964   51.284149   81.167549   53.799297   19.027866  14.644533   24.061693  36.095894  15.593305  52.814518   47.106213  40.647087   40.411690  46.323067  64.985306   112.807793  64.820419   104.483238   87.293083   82.768089    91.885117   49.162933   58.043594    72.681511
gene3  6.967771    11.112999   16.661377   12.513005   8.348808    3.606478   1.576240    3.155725   2.502464   2.007834   11.333991   8.626426   7.127884    3.307657   8.415873   3.260129    12.483765   11.294296   22.956882    13.596114   12.488963    9.070916    7.859025    11.917100    16.502171
gene4  0.505876    0.386053    0.912009    1.151058    1.154426    0.850491   0.175352    0.269306   0.603023   0.486635   1.176807    0.524952   1.303849    0.030600   1.180763   0.071114    0.826968    0.919727    0.965852     0.624409    0.112988     0.484227    0.0         0.0          0.157508
gene5  74.891602   106.629990  107.611679  184.312668  182.105698  54.929993  156.888580  95.991226  97.382843  57.194332  185.523758  85.128159  129.768570  87.086861  77.005058  87.280197   108.832001  142.719055  161.644943   158.324509  168.457855   196.658752  79.357765   77.824776    152.112717
gene6  43.037334   25.253721   18.894386   26.046051   25.136530   10.951700  5.766452    9.901020   13.677269  9.700789   25.597813   18.042780  25.968611   23.025476  23.210535  35.266296   53.085224   33.859856   56.133625    38.710495   33.187077    27.609497   23.028906   26.431442    24.113132
gene7  25.063200   56.035549   32.237309   72.436508   48.017216   26.486784  47.957367   44.359760  29.554129  25.999800  36.883751   17.445330  30.227165   15.413628  38.705254  30.413851   25.855337   19.630417   30.933867    35.670910   20.697100    30.442179   21.638878   36.755108    35.545338
gene8  11.461951   13.055794   9.187213    14.815991   11.335137   4.229527   4.162697    4.990695   2.702080   3.662157   11.143311   7.460255   7.482308    11.640666  9.239034   15.579340   13.978998   11.687348   12.549714    8.261336    14.801984    15.432146   10.693584   8.335018     17.221148
gene9  0.0         0.033566    0.329905    0.128400    0.042617    0.0        0.0         0.0        0.0        0.0        0.368945    0.033192   0.145969    0.000000   0.0        0.046507    0.149812    0.031563    2.481390     3.989131    0.000000     0.052335    0.093023    0.272024     0.965466
  • 想求每个基因每个样本的平均值,用awk实现的笨办法是将对应的列相加求平均值,
    ($2+$3+$4+$5+$6)/5,($7+$8+$9+$10+$11)/5,......
$ awk '{print $1,($2+$3+$4+$5+$6)/5,($7+$8+$9+$10+$11)/5,($12+$13+$14+$15+$16)/5,($17+$18+$19+$20+$21)/5,($22+$23+$24+$25+$26)/5}' a.tpm.tsv | sort -k1 | column -t
gene1  0         0.007919  0.0417744  436.062   833.515
gene2  83.9412   21.8847   45.4605    86.878    70.9082
gene3  11.1208   2.56975   7.76237    12.7182   11.5676
gene4  0.821884  0.476961  0.843394   0.681614  0.150945
gene5  131.11    92.4774   112.902    131.76    134.882
gene6  27.6736   9.99945   23.169     43.4111   26.874
gene7  46.758    34.8716   27.735     28.5009   29.0157
gene8  11.9712   3.94943   9.39311    12.4113   13.2968
gene9  0.106898  0         0.109621   1.33968   0.27657
  • 下面这行代码,只需要改变参数-v sample=5 -v repeat=5中的值,
    如:6个样本,每个样本3个重复,改为-v sample=6 -v repeat=3即可。

这行代码,感觉上用处不大,但如果要封装Shell脚本,还是挺方便的。
可以配合 脚本 | Shell | 任意n个样本表达量超过0.5视为表达 使用。

$ awk -v sample=5 -v repeat=5 '{for(i=1;i<=sample;i++){I=(i-1)*repeat;sum=0;for(j=1;j<=repeat;j++){sum+=$(I+j+1)};if(allsum[$1]=="")allsum[$1]=$1"\t"sum/repeat; else allsum[$1]=allsum[$1]"\t"sum/repeat}}END{for(k in allsum)print allsum[k]}' a.tpm.tsv | sort -k1 | column -t
gene1  0         0.007919  0.0417744  436.062   833.515
gene2  83.9412   21.8847   45.4605    86.878    70.9082
gene3  11.1208   2.56975   7.76237    12.7182   11.5676
gene4  0.821884  0.476961  0.843394   0.681614  0.150945
gene5  131.11    92.4774   112.902    131.76    134.882
gene6  27.6736   9.99945   23.169     43.4111   26.874
gene7  46.758    34.8716   27.735     28.5009   29.0157
gene8  11.9712   3.94943   9.39311    12.4113   13.2968
gene9  0.106898  0         0.109621   1.33968   0.27657

4.


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容