awk裡好用的變數:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

awk是非常好用的工具,之前稍微介紹過它的歷史,也因為其本身是設計用來處理字串的,所以存在高效方便的好處。而當要用awk來做比較複雜的功能時,比如把:單行字串轉換成多行時等,就需要瞭解以下這些變數:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

可以把field想成是一筆資料的行,而record則是一筆資料,理解這些字串會比較好理解 awk設計的邏輯。

這幾個變數的主要是用來:

  1. 定義字串裡面的行數分隔、換行符等,一些基本跟“一行字串”相關的數值

FS:輸入字串的分隔變數(Input Field Separator Variable)
本身預設是使用"空白格"來當作輸入字串的分隔
基本語法:

<br />用法一:$ awk -F 'Field separator' '指令' 輸入的檔案

用法二:$ awk 'BEGIN{FS='Field separator'}'

用法一,主要是把awk以cml工具來使用,而用法二則是把awk用完整語法來使用

ORS:輸出字串的分隔變數(Output Field Separator Variable)
本身預設是使用 “空白格"來當作輸出字串的分隔符
基本語法:

用法一:$ awk -F':' '{print $3,$4;}' /etc/passwd

用法二:$ awk -F':' 'BEGIN{OFS="=";} {print $3,$4;}' /etc/passwd

RS:記錄分隔變數(Record Separator variable)
本身預設是"\n",也就是一行一行的讀取,當可以改成比如兩行為一筆資料的讀取,這變數可以用來處理比較負責儲存的字串資料。

直接看範例,假如我們要處理像是下面的檔案時

Jones
2143
78
84
77

Gondrol
2321
56
58
45

當我們只想要取每組資料的前兩個,變成一行時

<br />awk 'BEGIN{RS="\n\n";FS="\n"}{print $1 $2}'

ORS:輸出資料每組分隔符(Output Record Separator Variable)

NR:第幾組資料(Number of Records Variable)

NF:每組資料第幾行 (Number of Fields)

以下兩個變數主要是在使用多個檔案,一起使用awk處理時會用到的

FILENAME:目前輸入資料的檔案名稱

FNR:目前第幾筆資料相對於當前輸入檔案

 

參考閱讀資料:

8 Poerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

awk中RS, ORS, FS, OFS區別與聯繫  (裡面有使用RS等更進階的用法)

Awk Tutorial Examples

awk簡介中文

 

 

如何組織每次的分析專案檔案

每一次的資料分析,都會產生大量各式檔案,有原始資料、前處理過的、分析的程式碼,所以多花點心思在每個步驟都稍微整理回顧一下,長久來說會減少很多“災難”,讓自己能有reproducible research skill. (其實就算是wet實驗也都是如此,只是dry的分析,幾乎都在電腦上,所以好的習慣變得很重要)。

論壇上其實有不少人也有這樣的問題,故整理一些不錯的文章,雖然每一個人的做法些許不同,但重點是要建立自己一套流程。

screenshot.png

第一個重點是以project為單位來整理,不要用時間或是分散式的,所有跟某一次實驗或是分析相關的就用一組架構,架構裡最主要就分三類:資料、分析結果、分析程式碼,也是根據這三類來分,另外,可以用subproject來往下。而可以多多利用command line的技巧來減緩創建資料夾的麻煩(使用wild card),而在README文件要有良好的documentation,且可以用純文字撰寫,但可以用markdown的風格撰寫,可以在使用工具轉換成pdf、doc,使用像是pandoc的工具。

主要多花時間整理自己電腦裡的資料,整體分析的工作流程會進步更快,雖然一開始在資料量少的時候會比較煩!之後再分享用git來做版本控制!

古老的程式語言awk

程式語言不斷地隨者電腦科學的發展在演進,awk可以說是最早的scripting language,衍生自貝爾實驗室,在1977年出現,其為Perl(1987)和Python(1989)的前身,有一陣不太有人使用,但隨者有結構的資料大增,這種古老語言的處理速度,使其再度被使用。

就實用性來說,可以用其來取代cut,其在將資料分成field有非常大的彈性。

基本awk架構

awk ` pattern {action } `

  • awk處理邏輯是以行為單位的
  • 當pattern存在於line中,執行action
  • 將每行中的空白格當作是分隔
  • pattern的辨識以最大化為主

特殊變數special variables

在pattern或是action指令中有變數功能,如前述每個space中間即可被當作是一個單位的資訊

  • $0 整行
  • $1  第一個field(行中由空白格分隔裡,第一組文字)
  • $2  第二個field
  • NF 第幾個field
  • NR 當下的line數

指令operators

  • +-*/ 加減乘除
  • >< ==, !=比較
  • % 取mode
  • ~,!~ 有無match到

有用的awk教學資源

如何使用SRA toolkits下載NIH的NGS data

screenshot.png

SRA database (Sequence Read Archive)是目前次世代定序實驗資料原始檔案的儲存地方,在越來越追求研究reproducible的時代,大多數基因體研究都會要求將資料上傳到雲端,讓其他科學家也能使用, 所以看到跟自己相關且興趣的基因體相關論文,想要自己下載其實驗定序出來的資料來分析一下,便可以先來NIH的網站瀏覽一番,看有無自已有興趣的資料,在用其原始資料accession number來下載,但次世代定序的資料動輒好幾GB,明智的做法是使用公用的linux server去下載,此使可以利用NIH 開發的SRA toolkit,這軟體主要是在command line環境下操作,只要知道自己想要下載資料的accession number,便能用一行指令下載好幾gb的檔案,甚至可以進行簡單的檔案轉換處理,而只要使用SRA toolkit便能簡單做到,這邊介紹一下如何用SRA toolkit來下載心儀的資料。

在此之前,我們先來了解一下SRA database其對檔案命名的眉角,其實是有一定的邏輯的,大致如下的命名編號架構(這邊指的是accession number):

 

screenshot.png

簡單來說,每個研究都會有個計畫編號,開頭大多會是PRJN或是SRP,這種計畫通常都會不只做一組檢體,而每個送去做定序的檢體都會有專屬編號,以SAMN開頭,而此檢體使用的定序實驗設計,也會有個編號,以SRX開頭,裡面會記錄此檢體所使用的定序機器種類、library type、定序設計(paired-end, single ….),而在同一次定序中其跑的run也會有編號,以SRR開頭。

接下來寫一下,SRA toolkit的下載和使用:

第一步:到此頁面下載符合自己系統的版本 link

screenshot.png

第二步:在系統下解壓縮
這邊以linux/mac系統的指令為例
$tar -xzf sratoolkit.current-centos_linux64.tar.gz

第三步:設定至系統路徑
此tool解壓縮完,其實就可以使用了,其tools的執行擋放在/sratoolkit/bin/的目錄下,直接打想要的tool linux是無法直接啟動,所以要去修改bash_profile,參考這篇網誌 如何設定檔案室系統路徑變數中

第四步:常用tools
其中最常用的工具就是fastq-dump了,可以用其直接使用accession number來query NIH 的SRA database並且下載fastq檔案,這邊是其指令介紹:screenshot.png
主要指令依功能分成三大類:

  1. data formating:下載後的檔案希望為什麼樣的格式,可以為fasta、fastq、sam,可以存成一個檔案,或是每個reads分開存 
  2. filtering:指定要下載特定區間內的reads
  3. workflow and piping:檔案最後要直接顯示在螢幕、或是儲存到特定的目錄中

    screenshot.png

 

 

 

 

 

給生物學家的計算分析(六):shell下建立scripts

閱讀自Practical Computing for biologists by Haddock Dunn

完整建立一個scripts是幫助自己在command line完成許多事情的力氣,就不用再做很多重複的工作。

基本概念:所有在command line底下的指令本就就是一組scripts

所有在command line下的使用指令,本身就是一個scripts,只是他一開始就安裝好了,如ls、cd、rm..等等,我們來看看他們放哪邊!screenshot.png

我們使用which這個指令可以用來找尋物件在系統中的路徑,會發現這些基本指令都放在 /bin 裡面,這資料夾放滿系統各式重要的資料,當我們輸入cd按下時,系統會去尋找這幾個資料夾內的scripts,看有沒有符合的名稱,有的話就會執行!那哪邊可以知道放置這些系統會去尋找的特定資料夾呢?

screenshot.png

使用echo $PATH,就能叫出目前系統當指令輸入後會去尋找的路徑!各個路徑用:隔開。所以我們只要把建好的檔案放進去這些資料夾中,便能像是cd一般的指令來使用,但把自己弄的“土炮”scripts弄髒系統裡面核心功能資料夾,似乎不是個很好的方式,所以另一方式就是建立一個資料夾,然後把其路徑放入$PATH中,似乎是個不錯的方式!那要如何做呢?

以MacOS系統為例,每個帳號都有一個系統隱藏檔案.bash_profile,是來儲存各種個人的設定,(在linux中為.bashrc),可以在母目錄裡輸入 ls -a 看到此資料夾screenshot.png

在裡頭輸入

screenshot.png

那如何將command lines結合成scipts可以參考這篇文章如何將command lines 組合成shell script

給生物學家的計算分析(五):shell下的文本處理

閱讀自Practical Computing for biologists by Haddock Dunn

shell環境下的文本處理效率相當高,但需要combine許多shell command line tool,且同樣的處理其實方法會有蠻多種的,可能隨者經驗增加或是使用的工具變多而調整,這邊就稍微介紹一些基本的工具,已可做非常多的應用。

shell環境裡的文本編輯器nano

在command line底下編寫文字,需要一個方便的工具,雖然之前介紹過圖形介面的TextWrangler,但直接在command line裡面編輯有時候比較方便,其實在unix核心下的系統(linux, OS X)有蠻多內建選擇的,如vi、 vim 、emac、pico,每種操作細節上都有一點不同,而這邊介紹nano,一款比較基礎的,可以直接在command line下呼叫 nano
螢幕快照 2016-01-16 上午7.35.37螢幕快照 2016-01-16 上午7.35.48

編輯器下排其實就有非常清楚的解說,關於如何離開、寫入等等,如輸入:

^X   離開
^O   寫入
^Y    向上翻頁
^V    向下翻頁

 

 

給生物學家的計算分析(四):進入shell

閱讀自Practical Computing for biologists by Haddock Dunn

command line的工作環境是一開始生物背景跨進生資分析的障礙之一,相對於已經被圖形介面(Graphical User Line)的電腦環境所嬌生慣養,要說服我們從舒適的圖形介面跳進黑壓壓的指令框框,想必要有強而有力的說詞,這邊就要說說圖形介面的壞處:
  • 生資分析常常要做複雜的步驟來處理資料,或是同樣的步驟操作多次,這些工作要是再圖形介面下不知道要用滑鼠點到什麼時候。
  • 一般在GUI的環境下,大部分的分析都不會留下log黨,讓我們去回顧可能是哪一個步驟做錯了,而在command line下則很方便能把不同分析步驟發生的事情紀錄在log中,等出問題的時候方便除錯
  • 叢集電腦系統不支持圖形化介面的操作,當我們需要使用更加計算能力時,使用圖形介面會是個問題
  • 對於軟體開發者來說,圖形介面的軟體開發複雜且不同平台使用會需要調整,所以在軟體更新上,command line操作環境下的軟體更新的較快!
以上的問題,其實很明顯地想要處理大型資料就必須要克服這個恐懼感。
基礎的unix command 知識:
  • 相對路徑和絕對路徑
  • 相對路徑的使用:
    • ~   代表home目錄
    • ..  代表前一個目錄
    • .   代表目前目錄
  • cd 可以用來在系統路徑中移動
  • 基礎指令:
指令
功能
ls
當下目錄的檔案
pwd
目前目錄之路徑
mkdir
建立資料夾
rmdir
移除資料夾
rm
移除檔案
less
看檔案
man
查看指令說明
cp
複製檔案
mv
移動檔案或是重新命名

給生物學家的計算分析(三):Regular Expression使用

思考如何寫Regular expression的thinking process
以下是資料
螢幕快照 2016-01-16 上午8.01.22
首先思考要如何整理,整理成什麼樣子
螢幕快照 2016-01-16 上午8.04.27
再來看目前資料每行的狀態
螢幕快照 2016-01-16 上午8.06.46
先看哪些是要的資訊,用(     ) 標示
(13) (Jan)uary, (1752) at (13):(53)    (-1.414)    ( 5.781)etc
先看括號裡的資料怎麼用Regular Expression表示
螢幕快照 2016-01-16 上午8.18.53
再將括號外的符號放進去
(13) (Jan)uary, (1752) at (13):(53)    (-1.414)    ( 5.781)etc
(\d+)\s+(\w{3})[\w\,\.]*\s+ (\d+)\sat\s (\d+):(\d+)\s+    ([-\d\.]+)\s+    ( [\d\.]+).*
    1               2                             3               4          5               6                         7
在調整取代裡面的括號資料順序
(13) (Jan)uary, (1752) at (13):(53)    (-1.414)    ( 5.781)etc
(\d+)\s+(\w{3})[\w\,\.]*\s+ (\d+)\sat\s (\d+):(\d+)\s+    ([-\d\.]+)\s+    ( [\d\.]+).*

    \3               \2 \.              \1               \4                 \5              \ 6                         \7

 

*:(quantifiers)至少符合0個
+:(quantifiers)至少符合1個

給生物學家的計算分析(一):文本乃資料分析之底

閱讀自Practical Computing for biologists by Haddock Dunn

 基本上,電腦的檔案都是一連串binarary numbers所組成的,另一種人類看得懂的格式則是文本形式(text files),而資料分析的起點便是如何處理這些text file,即使是我們引以為常的數字或是文字,電腦要呈現給我們看得懂,就必須要轉換格式,最常見的數字或是英文文字的格式便是American Standard Code for Information Interchange (ASCII)。

 這些為了讓人類能理解而加上的許多格式,在我們要分析的時候就變得很棘手,因為其賦予資料格式的符號很容易影響我們處理資料時的手續,所以一套看“純的”工具,便很重要!
目前最基本的文本架構為character-delimited text,就是由column和line來組成整個資料架構,其中delimited就是將每一行資料分開的符號,可以是空白鍵、逗點或tab,而第一行的資訊通常就是header.
目前主流操作系統為windows、mac和linux,以下就這三個系統推薦好用的純文本編輯器,各個功能強大。
系統
推薦程式
MAC
Windows
Linux
不同系統間,會有一些細微的差異,這邊提兩個:
  • Line ending:每個編輯器在處理每一個行最後結尾的標記不太一樣
    • 主要分成兩大類型標記:
      • Carriage return(CR) :使用\r
      • Line feed(LF): 使用\n
  • Display font:編輯器展現出來的樣子,這邊的展示通常都不會直接改變原本的資料
    • Proportionally spaced:字所佔空間一樣
      螢幕快照 2016-01-13 上午12.31.34
    • Fixed-space:字所佔空間不一樣
      螢幕快照 2016-01-13 上午12.31.38

如何將command lines 組合成shell script

Converting One-Liners into Shell Scripts

有時候在command line中會有些操作步驟是共通會使用的,這時候就可以把它們寫到shell scripts中(雖然減輕工作負擔的關鍵是你如何挑選要轉化成shell scripts的one-liners,這部分就要靠經驗了!)

主要步驟有六步:

  1. 將command line 寫入到file中
  2. 寫入執行權限(execute permissions)
  3. 定義shebang(直譯器的讀取參數,詳見維基),就是執行時告訴系統要用什麼直譯器去讀去。
  4. 去掉command line中固定的input 指向
  5. 添加可以修改的參數
  6. 將此shell script的位置放入環境裡的PATH

 

第一步驟:將command lines寫入成.sh 的檔案

$ vi top_words.sh

———- 按 i 進入編輯模式,結束後按est 然後輸入:wq存檔離開—–

$curl -s https://zh.wikipedia.org/wiki/Shebang |
$tr ‘[upper:]"[:lower:]’ |grep -oE  ‘\w+’|sort|uniq -c |
$sort -nr |head -n 10

第二步驟:修改此檔案的權限

chmod u+x top_words.sh

解釋: chmod   代表我們想要修改此檔案的使用權限細節
+              代表我們想要添加permission
u              代表我們要添加的permission是關於此檔案的讀取

小技巧,在我們使用 $ ls -l 時,通常會顯示當下目錄中的檔案細節如下:

$ls -l
-rw-rw-r– 1 weiting weiting 132 Jul 20 17:20 top_word.sh

最左邊的-rw-rw-r– 就代表此檔案的使用權限,此時是沒有關於讀取的權限。

第三步驟:定義此shell scripts的shebang

shebang通常就是在scripts的第一行,告訴系統要用什麼樣的直譯器來執行此scripts,此時我們要使用unix的bash (在linux中最常見的內建default 直譯器)

#!/usr/bin/env bash
$curl -s https://zh.wikipedia.org/wiki/Shebang |
$tr ‘[upper:]"[:lower:]’ |grep -oE  ‘\w+’|sort|uniq -c |
$sort -nr |head -n 10

小知識:其實shebang這個字是she+bang組合而成的,she其實就是hash(等於#)的意思,而bang則是exclamation mark

第四部:移除固定的input指向

#!/usr/bin/env bash
$curl -s https://zh.wikipedia.org/wiki/Shebang
$tr ‘[upper:]"[:lower:]’ |grep -oE  ‘\w+’|sort|uniq -c |
$sort -nr |head -n 10

第五步驟:添加參數

#!/usr/bin/env bash
NUM_WORD="$1″

$curl -s https://zh.wikipedia.org/wiki/Shebang
$tr ‘[upper:]"[:lower:]’ |grep -oE  ‘\w+’|sort|uniq -c |
$sort -nr |head -n $NUM_WORD

$1 代表的是在command line中位置於輸入第一個的參數

第六步驟:將此shell script的位置放入環境裡的PATH

使用$ls -a 來看家目錄下的.bashrc 或是.bash_profile,將你的scripts所在位置放入其中

$ export PATH$="your script directory:$PATH"

這樣就大功告成了!可以在任何地方執行你的scipts,如此便能減少很多重複工作!

 

reference:Jeroen JanssensData Science at the Command Line , Chapter 4
(強力推薦)