【问题标题】:awk to capture and reformat based on patternawk 根据模式捕获和重新格式化
【发布时间】:2018-11-25 13:28:20
【问题描述】:

下面的awk 捕获下面input 中第1-5 行的所需输出。我在第六行苦苦挣扎,似乎无法在awk 中添加一部分来捕获和打印所需输出中的第 6 行。打印id 以及- 之后的部分。我尝试添加拆分,但仅在字段 5 中打印数字。对于试图包含详细信息的长帖子,我深表歉意,因为我似乎无法弄清楚这一点。谢谢你:)

试了试

{ 
  split($4,F,/_/)
   if(split($4,A,/[_]/)) {
    if(A[2]~/[[:alpha:]]/)
     p=A[2]
}
 }
{
print "chr" $1, $2, $3, "chr" $1 ":" $2 "-" $3 OFS p
}

输入 tab-delimeted

6   18122723    18122843    469_380805_378884(NHLRC1)_1.1_1
6   31114121    31114241    344047_16724314_rs746647_1
6   31430946    31431066    344049_16724385_HCP5(10866)_1_1
6   32808479    32808599    445446_18754304_PSMB8-exon6_1
1   33478785    33478905    19186497_AK2-Exon1_1
1   24022788    24022908    466743_18956150_RPL11-NM_000975-exon6_1

想要的输出 tab-delimeted

chr6    18122723    18122843    chr6:18122723-18122843  NHLRC1
chr6    31114121    31114241    chr6:31114121-31114241  rs746647
chr6    31430946    31431066    chr6:31430946-31431066  HCP5
chr6    32808479    32808599    chr6:32808479-32808599  PSMB8-exon6
chr1    33478785    33478905    chr1:33478785-33478905  AK2-Exon1
chr1    24022788    24022908    chr1:24022788-24022908  RPL11-exon6

awk

awk '
 {
  split($4,F,/_/)
   if(split(F[3],G,/[)(]/)) {
     if(G[2]~/[[:alpha:]]/)
     p=G[2]
   else 
     p=G[1]
} 
   else 
     p=F[3]
}
{ 
  split($4,F,/_/)
   if(split($4,A,/[_]/)) {
    if(A[2]~/[[:alpha:]]/)
     p=A[2]
}
 }
{
print "chr" $1, $2, $3, "chr" $1 ":" $2 "-" $3 OFS p
}
' FS='\t' OFS='\t' input

电流输出 tab-delimeted

chr6    18122723    18122843    chr6:18122723-18122843  NHLRC1
chr6    31114121    31114241    chr6:31114121-31114241  rs746647
chr6    31430946    31431066    chr6:31430946-31431066  HCP5
chr6    32808479    32808599    chr6:32808479-32808599  PSMB8-exon6
chr1    33478785    33478905    chr1:33478785-33478905  AK2-Exon1
chr1    24022788    24022908    chr1:24022788-24022908  RPL11-NM

【问题讨论】:

  • 似乎没有定义拒绝NM 令牌的规则。它有 alpha char 如果这是手动完成的,你如何向某人描述它?例如为什么接受 RPL11 但拒绝 NM_000975

标签: awk


【解决方案1】:

这是另一种方法

$ awk 'BEGIN (FS=OFS="\t"} 
             {n=split($NF,a,"[_()-]"); 
              key=sep=""; 
              for(i=1;i<=n;i++) if(a[i]~/[a-zA-Z]+[0-9]+/) 
                 {key=key sep a[i]; sep="-"} 
              print $1,$2,$3,"chr"$1":"$2"-"$3,key }' file


6  18122723  18122843  chr6:18122723-18122843  NHLRC1
6  31114121  31114241  chr6:31114121-31114241  rs746647
6  31430946  31431066  chr6:31430946-31431066  HCP5
6  32808479  32808599  chr6:32808479-32808599  PSMB8-exon6
1  33478785  33478905  chr1:33478785-33478905  AK2-Exon1
1  24022788  24022908  chr1:24022788-24022908  RPL11-exon6

【讨论】:

    【解决方案2】:

    您显示的输出的最后一行似乎与您的法律不匹配(适用于所有其他行),考虑到这是一个错字,请尝试以下操作。

    awk '
    {
      if($NF ~ /\(/){
        sub(/.*\(/,"",$NF);
        sub(/\).*/,"",$NF)}
      else          {
        num=split($NF,array,"_");
        $NF=array[num-1]}
    }
    {
      $NF=$1":"$2"-"$3 OFS $NF
    }
    1
    '   Input_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多