Linux: 数据处理三??椭產wk

前言

??对于用Linux来处理数据的用户来说,应该都知道Linux处理数据的三个强有力的命令awk、sed、grep——人称三??汀D敲唇裉煜敫蠹曳窒硪桓銎渲械囊桓雒頰wk,为什么要跟大家分享这个命令呢?因为有时候我们需要做的事情很简单,不知道去写一个脚本,那就可以用一行命令来解决。awk用来干这些事情可以说是非常适合,因为awk可以做很多事情如匹配、切割、转置,甚至还可以在其内部写循环,用的好的话可以提高工作效率。今天我们来说一下三种常见情形下,如何方便快速的用awk一行代码来解决。

??下面我们来简单介绍一下awk的语法,完整的语法为:awk [optional] 'BEGIN{...}{...}END{...}' file/stdin。awk可用直接读取文件的内容也可以接受来至标准输入的内容,有了这个特性结合管道“|”来使用更加方便。在命令行可以查看awk可以接受的全部选项(如下所示),其实大部分我也没用过,感兴趣可以自己摸索一番,最常用的两个选项就是-F、-v,-F后面接的参数是用来分割内容的分隔符,-v 后面接的参数是awk外部的一个变量。

awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options: (standard)
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
Short options:          GNU long options: (extensions)
        -b                      --characters-as-bytes
        -c                      --traditional
        -C                      --copyright
        -d[file]                --dump-variables[=file]
        -e 'program-text'       --source='program-text'
        -E file                 --exec=file
        -g                      --gen-pot
        -h                      --help
        -L [fatal]              --lint[=fatal]
        -n                      --non-decimal-data
        -N                      --use-lc-numeric
        -O                      --optimize
        -p[file]                --profile[=file]
        -P                      --posix
        -r                      --re-interval
        -S                      --sandbox
        -t                      --lint-old
        -V                      --version

1、获取想要的列

??下面我们来通过具体的场景展现awk的能力,首先来看一下如何使用awk来分割内容获取想要的部分。例如这里有个文件总共9列,分隔符为制表符,但值得注意是第一列的内容为Ensembl ID和Symbol ID两部分组成,其中分隔符为空格,内容如下所示:

gene    C293T   igf     Igf2bp2 InputI  InputP  ptbp    Ptbp1   S293T
ENSG00000000003.15 TSPAN6       4.893   6.088   5.516   5.033   4.853   5.391   5.705   4.862
ENSG00000000005.6 TNMD  0.343   0       0       0.3872  0.3346  0       0       0.6902
ENSG00000000419.12 DPM1 4.529   4.691   4.685   4.554   4.375   2.234   4.394   4.372
ENSG00000000457.14 SCYL3        1.841   2.571   3.002   2.176   2.011   1.565   2.255   1.879
ENSG00000000460.17 C1orf112     3.431   4.441   4.324   3.674   3.618   2.611   3.857   3.652
ENSG00000000938.13 FGR  0       0       0       0       0.02306 0.07593 0       0
ENSG00000000971.16 CFH  0.1248  0.3185  0.01851 0.1209  0.1302  0.1272  0.006274        0.1486
ENSG00000001036.14 FUCA2        4.774   5.482   5.887   4.805   4.812   4.35    5.494   4.785
ENSG00000001084.13 GCLC 4.393   3.463   5.523   4.408   4.586   2.699   4.827   4.571
ENSG00000001167.14 NFYA 4.127   4.392   5.601   4.247   4.233   2.392   4.011   4.084
ENSG00000001460.18 STPG1        3.958   4.261   4.496   3.924   3.947   2.158   3.547   3.925

那我们来看如何提取想要的列,示例代码如下:

#提取前三列的内容到新文件里
awk -F"\t" '{OFS="\t";print$1,$2,$3}' zhaoy_log2TPM.txt >new.txt
#因为输入和输出的分隔符一致,上面的命令还可以写成
awk '{OFS=FS="\t";print$1,$2,$3}' zhaoy_log2TPM.txt >new.txt
#查看新文件内容
head nex.txt
gene    C293T   igf
ENSG00000000003.15 TSPAN6       4.893   6.088
ENSG00000000005.6 TNMD  0.343   0
ENSG00000000419.12 DPM1 4.529   4.691
ENSG00000000457.14 SCYL3        1.841   2.571
ENSG00000000460.17 C1orf112     3.431   4.441

??你以为这样就结束了么,awk还可以更厉害一点,还拿上面文件来说,我现在还是要前3列,但是第一列我只要Ensembl ID,那么该如何实现呢?请看下面示例代码:

#以制表符和空格一起作为分割符来分割内容
awk -F "[\t ]" 'BEGIN{print"gene\tC293T\tigf"}{OFS="\t";if(NR>1)print$1,$3,$4}' zhaoy_log2TPM.txt >new.txt
#查看内容
gene    C293T   igf
ENSG00000000003.15      4.893   6.088
ENSG00000000005.6       0.343   0
ENSG00000000419.12      4.529   4.691
ENSG00000000457.14      1.841   2.571
ENSG00000000460.17      3.431   4.441
ENSG00000000938.13      0       0
ENSG00000000971.16      0.1248  0.3185
ENSG00000001036.14      4.774   5.482
ENSG00000001084.13      4.393   3.463

??是不是很方便,awk可以同时接受多个分隔符,这个功能就更厉害了,即使用来处理gtf文件也是可以的。用好了可以一行命令解决大部分的文件。

2、两个文件匹配

??有时候我们想要根据两个文件共有列的内容来合并两个文件,这个适合如何用一行代码来完成呢?例如我有两个文件内容如下:

#文件test1.txt
gene    C293T   igf
ENSG00000000003.15      4.893   6.088
ENSG00000000005.6       0.343   0
ENSG00000000419.12      4.529   4.691
ENSG00000000457.14      1.841   2.571
ENSG00000000460.17      3.431   4.441
#文件test2.txt
gene    Igf2bp2 Igf2bp2
ENSG00000000003.15      5.516   5.033
ENSG00000000005.6       0       0.3872
ENSG00000000419.12      4.685   4.554
ENSG00000000457.14      3.002   2.176
ENSG00000000460.17      4.324   3.674

??可以看到上面两个文件有共同的列,那么我们如何根据这个共同的列来匹配合并两个文件呢?请看下面的代码:

#根据第一列来合并两个文件
awk 'NR==FNR{OFS=FS="\t";a[$1]=$2FS$3;next}{if($1 in a)print$0,a[$1]}' test1.txt test2.txt >merge.txt
#查看合并的内容
gene    Igf2bp2 InputI  C293T   igf
ENSG00000000003.15      5.516   5.033   4.893   6.088
ENSG00000000005.6       0       0.3872  0.343   0
ENSG00000000419.12      4.685   4.554   4.529   4.691
ENSG00000000457.14      3.002   2.176   1.841   2.571
ENSG00000000460.17      4.324   3.674   3.431   4.441
ENSG00000000938.13      0       0       0       0

是不是很方便,有了这个功能,提取匹配两个文件来提取内容,只用一行代码就可以搞定,分分钟的事!

3、文件转置

??有时候需要将文件行和列转置,这个时候也可以用awk来完成,同样是一行代码即可搞定。就拿上面的test1.txt文件来做示范,示例代码如下:

#转置文件
awk '{for(i=1;i<=NF;i++){a[FNR,i]=$i}}END{for(i=1;i<=NF;i++){for(j=1;j<=FNR;j++){printf a[j,i]"\t"}print ""}}' test1.txt >zhuanzhi.txt
#查看转置后的文件
gene ENSG00000000003.15 ENSG00000000005.6 ENSG00000000419.12 ENSG00000000457.14
C293T   4.893   0.343   4.529   1.841
igf     6.088   0       4.691   2.571

??转置文件用awk来做也是分分钟的事,用awk来处理数据有时候真的是省时省力,现在是不是觉得awk很给力,其实它还有很多功能,学好了可以用来做很多的事。对于没有编写脚本需求的事来说,用awk命令行来解决,一行代码方便快捷。

最后

??emm,今天就分享到这里,现在是不是觉得awk这个命令很实用,赶快用起来吧!

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