awk處理之案例二:awk匹配文本


編譯環境

   本系列文章所提供的算法均在以下環境下編譯通過。

【腳本編譯環境】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當中則輸出另外一種格式。

【測試】

10

作者

   出處:http://www.cnblogs.com/gina

   本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM