三劍客 | awk

我剛開始一直不理解 awk 的語法元潘,后來看師兄的代碼,加上天天敲君仆,有了點提高翩概。

師兄在 2020-07-03 常用有趣命令之?dāng)?shù)據(jù)處理 中總結(jié)了很多代碼,非常有用返咱!
我經(jīng)常記不住钥庇,用到時就會進(jìn)去復(fù)制下來。下面是一些簡單基礎(chǔ)的用法洛姑。


1. 內(nèi)置變量

$0: 記錄變量上沐,表示當(dāng)前正在處理的記錄,理解為整行楞艾;
$n: 字段變量参咙,其中n為整數(shù),且 n 大于1硫眯,表示第 n 個字段的值蕴侧,理解為第 n
NF: 當(dāng)前記錄的字段數(shù)(number of field)两入,理解為列數(shù)净宵;
NR: 已經(jīng)讀入的記錄數(shù)(number of record),理解為行數(shù)裹纳;
FS: 字段分隔符(field seperator)择葡,默認(rèn)列分隔符為空白,awk -F "," 即可設(shè)置為 ,剃氧;
RS: 記錄分隔符(record seperator)敏储;
OFS: 輸出字段分隔符;
ORS: 輸出記錄分隔符朋鞍;
FILENAM: 正在處理的數(shù)據(jù)文件的名稱已添;
ARGIND: 實現(xiàn)多個文件的操作,可以參考:AWK實現(xiàn)多文件讀取和處理滥酥、awk打開多個文件的方法更舞;
FNR: 當(dāng)前文檔的記錄數(shù),多文件操作時使用坎吻。

  • 去除最后一列
awk '{$NF="";print}' a.txt

尤其是每行列數(shù)不一樣時缆蝉,尤為實用,但每行最后會多出一個分隔符,可以用函數(shù)gsub(/.$/,"")進(jìn)行刪除返奉,也可以用管道 | sed 's/.$//'

  • 多文件操作
    如:合并多個文件贝搁,并把每個文件的第一樣去除
awk '{if(FNR>1)print}' a.txt b.txt c.txt

2. 運算符

  • 算術(shù)運算符
    +: 加;-: 減芽偏;*: 乘;/: 除

  • 賦值運算符
    +=: 將前后兩個數(shù)值相加后的和賦給前面的變量
    -=: 將前后兩個數(shù)值相減后的差賦給前面的變量
    */: 將前后兩個數(shù)值的乘積賦給前面的變量
    /=: 將前后兩個數(shù)值的商賦給前面的變量

  • 關(guān)系運算符
    >弦讽、<污尉、>=<=往产、==被碗、!= 這些都不用說了

  • 邏輯運算符
    &&: 邏輯與,前后兩個表達(dá)式的值全部為真時仿村,其運算結(jié)果為真
    ||: 邏輯或锐朴,前后兩個表達(dá)式只要有一個為真,其運算結(jié)果為真
    !: 邏輯非蔼囊,表達(dá)式的值為假時焚志,其運算結(jié)果為真

  • 三目運算符
    下面這個例子也用到了格式化輸出

>g1
AGTCAT
CATACG
GCACTC
AT
>g2
CCATCA
TCAGGC
C
>g3
ACCTTG
GGCC
$ awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }' gene.fa
>g1 AGTCATCATACGGCACTCAT
>g2 CCATCATCAGGCC
>g3 ACCTTGGGCC$

可發(fā)現(xiàn)每個基因變成了一行兩列,第一列為id畏鼓,第二列為序列酱酬。
加上| awk '{print $1"\n"}' 即可變成正常的單行 fasta 序列;
若加上| awk '{a+=length($2)}END{print a}' 即可得出序列的大小云矫。

3. 函數(shù)

  • 字符串函數(shù)
    length(): 返回字符串的長度
    gsub(): 替換所有出現(xiàn)的子串
    substr(): 截取指定長度的子串膳沽。

另外還有,字符串函數(shù)让禀,index()挑社、match()split()巡揍、sub()痛阻;算術(shù)函數(shù),int(x)吼肥、sqrt(x)录平、exp(x)...... 用不到,暫且留個印象缀皱。

$ echo "0.9774563" | awk '{print int($1*10000+0.5)*0.01"%"}'
97.75%

4. 數(shù)組

以下兩行代碼都是利用 數(shù)組 實現(xiàn)【轉(zhuǎn)置】斗这,代碼是師姐網(wǎng)上找的,出處已經(jīng)找不到了啤斗。

awk '{for(i=1;i<=NF;i++){if(NR==1)res[i]=$i;else res[i]=res[i]" "$i}}END{for(j=1;j<=NF;j++){print res[j]}}' a.txt
# 有幾列就定義幾個數(shù)組元素表箭,運行每一行時對數(shù)組進(jìn)行重新定義
awk '{for(i=1;i<=NF;i=i+1){a[NR,i]=$i}}END{for(j=1;j<=NF;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str" "a[i,j]}print str}}' a.txt
# 先是對每一個值按坐標(biāo)進(jìn)行定義數(shù)組,按坐標(biāo)把相同列的排成行钮莲,太慢了

Shell 的 join 命令可以聯(lián)接多個文件免钻,但需要進(jìn)行排序彼水,還總是會莫名報錯,結(jié)果不可靠极舔,awk 就很好使凤覆。

$ cat a.txt
gene2   noTF    others
gene1   TF      MYB
gene3   TF      HD-ZIP
gene15  noTF    others
$ cat b.txt
gene10  23      9
gene12  56      7
gene3   75      8
gene4   84      2
gene1   50      3
gene2   74      6
$ awk 'BEGIN{OFS="\t"}ARGIND==1{a[$1]=$0}ARGIND==2{if($1 in a)print a[$1],$2,$3; else print $1,"NA\tNA",$2,$3}' a.txt b.txt
gene10  NA      NA      23      9
gene12  NA      NA      56      7
gene3   TF      HD-ZIP  75      8
gene4   NA      NA      84      2
gene1   TF      MYB     50      3
gene2   noTF    others  74      6

5. 控制流

日常 | 2021-05-10 | 任意n個樣本表達(dá)量超過0.5視為表達(dá) 的一個例子:

awk '{a=0;for(i=2;i<=NF;i++){if($i>0.5)a++};if(a>=2)print}' a.tsv
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拆魏,隨后出現(xiàn)的幾起案子盯桦,更是在濱河造成了極大的恐慌,老刑警劉巖渤刃,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拥峦,死亡現(xiàn)場離奇詭異,居然都是意外死亡卖子,警方通過查閱死者的電腦和手機(jī)略号,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋闽,“玉大人玄柠,你說我怎么就攤上這事『暗荩” “怎么了随闪?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骚勘。 經(jīng)常有香客問我铐伴,道長,這世上最難降的妖魔是什么俏讹? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任当宴,我火速辦了婚禮,結(jié)果婚禮上泽疆,老公的妹妹穿的比我還像新娘户矢。我一直安慰自己,他們只是感情好殉疼,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布梯浪。 她就那樣靜靜地躺著,像睡著了一般瓢娜。 火紅的嫁衣襯著肌膚如雪挂洛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天眠砾,我揣著相機(jī)與錄音虏劲,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛柒巫,可吹牛的內(nèi)容都是我干的励堡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼堡掏,長吁一口氣:“原來是場噩夢啊……” “哼应结!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泉唁,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤摊趾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后游两,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡漩绵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年贱案,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止吐。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡宝踪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碍扔,到底是詐尸還是另有隱情瘩燥,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布不同,位于F島的核電站厉膀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏二拐。R本人自食惡果不足惜服鹅,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望百新。 院中可真熱鬧企软,春花似錦、人聲如沸饭望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铅辞。三九已至厌漂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巷挥,已是汗流浹背桩卵。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏节。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓胜嗓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钩乍。 傳聞我的和親對象是個殘疾皇子辞州,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一、awk簡介 awk其名稱得自于它的創(chuàng)始人 Alfred Aho 寥粹、Peter Weinberger 和 Bri...
    鐘離惜閱讀 4,937評論 0 2
  • 背景 awk 是一個文本處理工具变过,通常用于處理數(shù)據(jù)并生成結(jié)果報告。awk 的命名是它的創(chuàng)始人 Alfred Aho...
    AydanLinux閱讀 262評論 0 0
  • awk簡介 awk是一種編程語言涝涤,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理媚狰。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdi...
    小啊小狼閱讀 365評論 0 0
  • 1、介紹 awk是一種編程語言阔拳,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理崭孤。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(s...
    馮艷輝brook閱讀 857評論 0 49
  • 1、awk 簡介 awk其名稱來自于它的創(chuàng)始人 Alfred Aho 糊肠、Peter Weinberger 和 Br...
    probie_rise閱讀 231評論 0 0