awk删除文本并在两个分隔符上拆分

awk删除文本并在两个分隔符上拆分,awk,Awk,我正在尝试使用awk删除最后一个数字后的文本,并按:分割。这对两行来说都是通用的,我相信下面的awk的第一部分可以做到这一点。如果行中没有\uuu,则$2会在$3中重复,我相信拆分可以做到这一点。我不知道怎么做,如果行中是\uu,则\u左侧的数字是$2,而\u右侧的数字是$3。谢谢:) 输入 chr7:140453136A>T  chr7:140453135_140453136delCAinsTT 所需的 chr7 140453136 140453136  chr7 14

我正在尝试使用
awk
删除最后一个数字后的文本,并按
分割。这对两行来说都是通用的,我相信下面的
awk
的第一部分可以做到这一点。如果行中没有
\uuu
,则
$2
会在
$3
中重复,我相信拆分可以做到这一点。我不知道怎么做,如果行中是
\uu
,则
\u
左侧的数字是
$2
,而
\u
右侧的数字是
$3
。谢谢:)

输入

chr7:140453136A>T 
chr7:140453135_140453136delCAinsTT
所需的

chr7    140453136   140453136 
chr7    140453135   140453136
awk

awk '{sub(/[^0-9]+$/, "", $1); {split($0,a,":"); print a[1],a[2]a[2]} 1' input
这里有一个:

$ awk '
BEGIN { 
    FS="[:_]"               # using field separation for the job
    OFS="\t"
}
{
    sub(/[^0-9]*$/,"",$NF)  # strip non-digits off the end of last field
    if(NF==2)               # if only 2 fields
        $3=$2               # make the $2 from $2
}1' file                    # output
输出:

chr7    140453136       140453136
chr7    140453135       140453136
在GNU awk、mawk、Busybox awk和awk版本20121220上测试。

以下是一个:

$ awk '
BEGIN { 
    FS="[:_]"               # using field separation for the job
    OFS="\t"
}
{
    sub(/[^0-9]*$/,"",$NF)  # strip non-digits off the end of last field
    if(NF==2)               # if only 2 fields
        $3=$2               # make the $2 from $2
}1' file                    # output
输出:

chr7    140453136       140453136
chr7    140453135       140453136
在GNU awk、mawk、Busybox awk和awk版本20121220上测试。

使用GNU awk:

awk -v FPAT='[0-9]+|chr[0-9]*' -v OFS='\t' 'NF==2{$3=$2}{$1=$1}1'
这取决于字段模式
FPAT
,它是一个表示数字的正则表达式或带有数字的字符串
chr

如果记录中只有2个字段,则语句
NF==2{$3=$2}
将复制第二个字段

最后一条语句是强制awk重新生成具有所需格式的记录。

使用GNU awk:

awk -v FPAT='[0-9]+|chr[0-9]*' -v OFS='\t' 'NF==2{$3=$2}{$1=$1}1'
这取决于字段模式
FPAT
,它是一个表示数字的正则表达式或带有数字的字符串
chr

如果记录中只有2个字段,则语句
NF==2{$3=$2}
将复制第二个字段


最后一条语句是强制awk重新生成记录,使其具有所需的格式。

请尝试以下更通用的解决方案,即无需硬编码将字段值复制到其他字段等,您只需在
awk
变量中提及字段值的最大数量,它将检查每一行(同时从其值中删除字母),并将最后一个值复制到该行的最大值末尾

awk -F'[:_]' -v max="3" '
{
  for(i=2;i<=max;i++){
    if($i==""){
      $i=$(i-1)
    }
    gsub(/[^0-9]+/,"",$i)
  }
}
1
'   Input_file
awk-F'[:]'-v max=“3”' {
对于(i=2;i您是否可以尝试以下更通用的解决方案,即无需硬编码将字段值复制到另一个字段等,您只需提及
awk
变量中字段值的最大数量,它将检查每一行(同时从其值中删除字母)并将最后一个值复制到该行的最大值末尾

awk -F'[:_]' -v max="3" '
{
  for(i=2;i<=max;i++){
    if($i==""){
      $i=$(i-1)
    }
    gsub(/[^0-9]+/,"",$i)
  }
}
1
'   Input_file
awk-F'[:]'-v max=“3”' {
对于(i=2;如果出现问题,请等待更长时间,您可能会得到一个bitchin'cool答案。相反,如果使用sub,您可以只执行
$NF+=0
。字符串到数字的转换规则将生效。当前版本将无法解决字符串1234gh5hsueNo问题,请等待更长时间,您可能会得到bitchin'cool答案。如果使用sub,您只需执行以下操作即可。)<代码>$NF+=0。字符串到数字的转换规则将生效。当前版本将在字符串1234gh5hsue上失败