awk基于模式捕获和重新格式化

时间:2018-06-15 17:09:51

标签: awk

下面的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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是另一种方法

$ 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
相关问题