編譯環境
本系列文章所提供的算法均在以下環境下編譯通過。
【腳本編譯環境】Federa 8,linux 2.6.35.6-45.fc14.i686
【處理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【內存】 2025272 kB
前言
awk是腳本中出色的文本處理工具。源碼好像也是用C語言寫的。本系列會針對不同的案例,用awk來解決我們所要的問題。 為什么會用awk呢?我們當然可以使用C語言或者java語言來對文本做處理,但每次都要編譯會令人發瘋的。修改起來也麻煩,正所謂殺雞焉用牛刀。而腳本的靈活便捷使得工作變得更加輕松容易。在shell腳本編程中,awk堪稱瑞士軍刀絕不為過。
本系列文章均系筆者所寫,難免有一些錯誤或者紕漏,如果小伙伴們有好的建議或者更好的算法,請不吝賜教。
正文
【場景】
現在有兩個文本a.txt, b.txt,里面包含的內容如下所示。現在要提取出b中匹配到a的信息,就是第一列基因名相同,第二列NM號也相同的信息,輸出a文件的該行到C文件並加上一列“0”,如果b的文件存在a沒有的NM號,則把該NM號加進去,並標識為1
a.txt文本內容如下:
ABCC9 NM_005691.2 N
ABCC9 NM_020297.2 Y
ACE NM_000789.3 Y
ADD1 NM_001119.4 N
ADD1 NM_014189.3 Y
b.txt文本內容如下:
ABCC9 NM_020297
ACE NM_000789
ACER1 NM_133492
ACE2 NM_021804
ADD1 NM_001119.4
ADD1 NM_014189.3
ADD1 NM_014190.3
ADD2 NM_001185055.1
提取完之后,c.txt文本內容如下:
ABCC9 NM_020297 1
ACE NM_000789 1
ACER1 NM_133492 1
ACE2 NM_021804 1
ADD1 NM_001119.4 N 0
ADD1 NM_014189.3 Y 0
ADD1 NM_014190.3 1
ADD2 NM_001185055.1 1
【代碼】
# extract txt line from a.txt that also in b.txt
# grammer: awk -test.awk a.txt b.txt
{
if(NR==FNR)
{
a[$1$2]=$0
next
}
if($1$2 in a)
{
print a[$1$2]" 0"
}
else
{
print $0" 1"
}
}
【解釋】
NR是工作中的記錄數;FNR是當前輸入文件的記錄上。
當輸入一個文件時,NR和FNR輸出是一樣的;當輸入2個以上文件時,NR和FNR輸出是不一樣的。例如:
# awk '{print NR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
4 aa bb cc dd
5 aa bb dd cc
6 aa cc bb dd
# awk '{print FNR,$0}' file1 file2
1 a b c d
2 a b d c
3 a c b d
1 aa bb cc dd
2 aa bb dd cc
3 aa cc bb dd
上面語句的意思是,當NR和FNR相等的時,即第一個文件的內容全部存儲到a當中。底下兩個判斷,如果是遍歷a,b文件中所有行,如果在a當中則輸出一種格式,如果不在a當中則輸出另外一種格式。
【測試】
作者
出處:http://www.cnblogs.com/gina
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。