學(xué)生信的那些事兒之八 - Linux基礎(chǔ)之編輯器:sed & gawk

Shell腳本最常見的用途就是文本處理,但是想要處理更多類型的數(shù)據(jù),sed和gwak工具是不得不學(xué)的。沒有真正的處理實際的組學(xué)數(shù)據(jù)實操示例就說這兩個工具多么多么重要,總感覺有些空洞。這個比較尷尬,因為直接開始處理組學(xué)肯定更是云里霧里,不知從何下手。每一行都講究基本功,有一段時間學(xué)街舞(當(dāng)然是半途而廢了),老師在很長時間就是教一些特別枯燥無聊,而且重復(fù)性很高的動作。要求我們一直練,練到像吃飯拿筷子一樣自然,我們當(dāng)然不開心,總想著趕快學(xué)會一套炫酷舞步,然后在心儀的妹子面前裝逼一番。不過時間久了就明白了老師的苦心,后面的所謂編舞其實可以沒有的,音樂響起后,跟著節(jié)奏,只需要把從前學(xué)過的"枯燥無聊"動作簡單組合,就是非常有feeling的舞蹈。大概是一樣的道理吧,先把各種會用到的工具學(xué)到家,真正面對數(shù)據(jù)的時候上手必然快。

sed編輯器

概念

sed編輯器是一種流編輯器(stream editor), 至于什么叫做"流",我也不是很確定,但是形象化的認(rèn)知就是sed工具可以處理的數(shù)據(jù)。與之前提到的vim編輯器不同(交互式的,可直接對數(shù)據(jù)進(jìn)行插入、刪除或替換操作),sed是通過預(yù)先設(shè)定好的"一組規(guī)則"對數(shù)據(jù)流進(jìn)行處理。

sed編輯器處理數(shù)據(jù)的流程(特點(diǎn)):

  1. 一次從輸入中讀取一行數(shù)據(jù)(處理單位是)
  2. 根據(jù)提供的編輯器命令匹配數(shù)據(jù)(會用到所謂的"規(guī)則")
  3. 按照命令修改數(shù)據(jù)流中的數(shù)據(jù)
  4. 將新的數(shù)據(jù)輸出到STDOUT(標(biāo)準(zhǔn)輸出)

語法

# 命令格式如下:
sed options script file
# options (選項)可選項有:
  -e script   可從腳本中讀取命令
  -f file     可從文件中讀取命令
  -n          不產(chǎn)生命令輸出,使用print命令完成輸出

功能

1. 替換 ( substitute )

# 命令格式
sed 's/pattern/replacement/flags' text.txt
# 注釋
  pattern:需要被替換的原始內(nèi)容,比如張三
  replacement:原始內(nèi)容被替換后的內(nèi)容,比如李四,也就是說用李四替換張三,后面的替換前面的

命令格式最后一個正斜線后面有一個flags(標(biāo)記),有4種替換標(biāo)記可用:

  • 數(shù)字,表示新文本替換第幾處匹配的地方(以行為單位)

  • g,表示新文本會替換所有匹配到的文本

  • p,表明原先行的內(nèi)容要打印出來

  • w file,將替換的結(jié)果寫到文件中(像是重定向)

    示例

    這個就不寫了吧~

2. 刪除 ( delete )

# 命令格式
sed '3d' text.txt
# 注釋
  上面的命令是一個具體的命令,意思是刪除text.txt文件中的第三行(3 delete)。

話已至此,不能不講行尋址( line addressing )了,簡單點(diǎn)說就是定位到哪一行。有兩種尋址模式:以數(shù)字形式和文本模式?;靖袷饺缦拢?/p>

# 數(shù)字形式
  [address]command, 比如:
  sed '2s/cat/dog/' text.txt (表示將text.txt文本中第二行的cat替換為dog)
# 文本模式
  /pattern/command, 比如:
  sed '/Jude/s/cat/dog/' text.txt (表示將text.txt文本中含有Jude字符的一行中的cat替換為dog)

3. 插入( insert )和附加( append )文本

  • 插入( insert )命令( i )會在指定增加一個新行;
  • 附加( append )命令( a )會在指定增加一個新行;

命令格式如下:

sed '[address]command\new line'
# 示例
sed '3i\jude is a man' text.txt
# 上面的命令表示在text.txt文本中的第三行前面插入jude is a man;
# 附加命令一樣一樣的;
# 需要注意的是,這個命令里面的斜線是反斜線 '\',而不是正斜線 '/';

4. 修改( change )行

命令格式跟插入和附加一樣,同樣需要指定新一行的內(nèi)容,而且這個修改命令是修改整行的內(nèi)容。

sed '[address]command\new line'
# 示例
sed '3c\jude is a man' text.txt
# 上面的命令表示將text.txt文本中的第三行內(nèi)容修改為jude is a man;

5. 轉(zhuǎn)換命令( transform )

轉(zhuǎn)換( transform )命令( y )是唯一可以處理單個字符的sed編輯器命令,格式如下:

[address]y/inchars/outchars/
# 轉(zhuǎn)換命令是一對一的映射替換,同樣是后者替換前者,而且是outchars中的第一個字符會替換inchars中的第一個字符,以此類推。例:
sed 'y/123/456/' text.txt
# 上例表示文本text.txt中的數(shù)字1,2,3會被分別替換為4,5,6.

gwak程序

sed編輯器固然好,gawk程序更加棒。gawk程序是Unix中原始awk程序的GNU版本(mac終端自帶的是awk,要使用gawk得安裝gawk包),其可以提供一個類似編程環(huán)境,從而修改和重新組織文件中的數(shù)據(jù)。也就是說它提供了一種編程語言而不僅僅是編輯器命令(傳聞公司里有的生信前輩gawk玩的很溜,真的幾乎都可以不用其他編程語言)。在gawk編程語言中可以實現(xiàn)如下操作:

  • 定義變量來保存數(shù)據(jù)
  • 使用算數(shù)和字符串操作來處理數(shù)據(jù)
  • 使用結(jié)構(gòu)化編程概念(if-then 和循環(huán)等)來為數(shù)據(jù)處理增加處理邏輯
  • 通過提取數(shù)據(jù)文件中的數(shù)據(jù)元素,將其重新排列或格式化,生成格式化報告(處理組學(xué)數(shù)據(jù)時這個經(jīng)常會用)

命令格式

gawk options program file
# 可用選項(options)
  -F fs             指定行中劃分?jǐn)?shù)據(jù)字段的字段分隔符
  -f file           從指定的文件中讀取程序
  -v var=value      定義gawk程序中的一個變量及其默認(rèn)值
  -mf N             指定要處理的數(shù)據(jù)文件中最大字段數(shù)
  -mr N             指定數(shù)據(jù)文件中的最大數(shù)據(jù)行數(shù)

用一個示例簡單介紹下gawk的用法:

$ echo "my name is Jude" | gawk '{$4='Jude'; print $0}'
  my name is Jude
$
# 注釋
  1. gawk命令格式必須得有 '{}',這是規(guī)矩,不解釋,不爭辯,接受就好
  2. $4是一個變量,gawk一個很有意思的特征就是它會自動給一行中的每個數(shù)據(jù)元素分配一個變量,所以此處的$4表示這一行的第四  
     個元素,以此類推
  3. 程序腳本中可以使用多個命令,用;隔開即可
  4. print 是腳本定義的一個命令,會將文本打印到STDOUT

上面的介紹當(dāng)然只是gawk功能的冰山一角,更多的自己去學(xué)吧,更有樂趣些,網(wǎng)上有很多教程分享,當(dāng)然看書更好喔~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容