如何提取出現在同一文本文件中不同行的多位信息

如何提取出現在同一文本文件中不同行的多位信息

我試圖提取同一文字檔案中不同行上出現的序列 ID 和簇號。

輸入看起來像

>Cluster 72
0   319aa, >O311_01007... *
>Cluster 73
0   318aa, >1494_00753... *
1   318aa, >1621_00002... at 99.69%
2   318aa, >1622_00575... at 99.37%
3   318aa, >1633_00422... at 99.37%
4   318aa, >O136_00307... at 99.69%
>Cluster 74
0   318aa, >O139_01028... *
1   318aa, >O142_00961... at 99.69%
>Cluster 75
0   318aa, >O300_00856... *

所需的輸出是一列中的序列 ID 和第二列中的對應簇號。

>O311_01007  72
>1494_00753  73
>1621_00002  73
>1622_00575  73
>1633_00422  73
>O136_00307  73
>O139_01028  74
>O142_00961  74
>O300_00856  75

有人能幫忙嗎?

答案1

使用 awk:

awk -F '[. ]*' 'NF == 2 {id = $2; next} {print $3, id}' input-file
  • 我們用空格或句點分割字段-F '[. ]*'
  • 對於兩個欄位的行(行>Cluster),將第二個欄位儲存為 ID 並移至下一行
  • 與其他行一起,列印第三個欄位和已儲存的 ID

答案2

您可以awk為此使用:

awk '/>Cluster/{
      c=$2;
      next
    }{
      print substr($3,2,length($3)-4), c
    }' file

第一個區塊語句正在捕獲集群 ID。第二個區塊語句(預設區塊語句)是提取所需的資料並列印它。

答案3

這是使用 Ruby 作為單行程式碼的替代方案:

ruby -ne 'case $_; when /^>Cluster (\d+)/;id = $1;when /, (>\w{4}_\w{5})\.\.\./;puts "#{$1} #{id}";end' input_file

或分佈在多行上:

ruby -ne 'case $_
when /^>Cluster (\d+)/
  id = $1
when /, (>\w{4}_\w{5})\.\.\./
  puts "#{$1} #{id}"
end' input_file

awk我想如果您了解 Ruby 和 regexen,它只會比該版本更具可讀性。作為獎勵,此程式碼可能比簡單地分割行更健壯,因為它會尋找周圍的文字。

答案4

珀爾:

$ perl -ne 'if(/^>.*?(\d+)/){$n=$1;}else{ s/.*(>[^.]+).*/$1 $n/; print}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

解釋

  • perl -ne:逐行讀取輸入檔 ( -n) 並將 給定的腳本套用-e到每一行。
  • if(/^>.*?(\d+)/){$n=$1;}:如果該行以 開頭>,則找到該行末尾最長的一段數字,並將其儲存為$n.
  • else{ s/.*(>[^.]+).*/$1 $n/; print:如果該行不以 開頭,則將所有內容替換為( )後面>最長的非字符,即序列名稱(因為我們有.>>[^.]+$1被捕獲正規表示式符合)和 的當前值$n

或者,對於更類似 awk 的方法:

$ perl -lane 'if($#F==1){$n=$F[1]}else{$F[2]=~s/\.+$//; print "$F[2] $n"}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

這只是實現與各種awk方法相同的基本想法的稍微麻煩的方法。我將其包含在內是為了完成工作並為了 Perl 粉絲。如果您需要解釋,只需使用 awk 解決方案:)。

相關內容