Awk 仅在下一列中更改与另一个模式匹配的模式

Awk 仅在下一列中更改与另一个模式匹配的模式,awk,Awk,这是我的文件的标题: 1 HAVANA gene 11869 14409 . + . gene_name "DDX11L1" remap_original_location "chr1:+:11869-14409" 1 HAVANA gene 118569 148409 . + . gene_name "ORF21" remap_original_location "chr1:+:118569-148409" cli

这是我的文件的标题:

1 HAVANA gene 11869 14409 . + . gene_name "DDX11L1" remap_original_location "chr1:+:11869-14409"
1 HAVANA gene 118569 148409 . + . gene_name "ORF21" remap_original_location "chr1:+:118569-148409" clinSig 0.59
1 HAVANA transcript 118568 148419 . + . remap_original_location "chr1:+:118568-148419" clinSig 0.02 M .
MT HAVANA gene 226 399 . + . remap_original_location "chrM:+:226-399" * + 3
MT HAVANA * 27 . -
我想将与此内容完全相同的内容保存到另一个文件中,但只需删除chr模式,并在匹配remap_original_位置的列旁边的列中将M转换为MT模式

因此,我期望的输出是:

1 HAVANA gene 11869 14409 . + . gene_name "DDX11L1" remap_original_location "1:+:11869-14409"
1 HAVANA gene 118569 148409 . + . gene_name "ORF21" remap_original_location "1:+:118569-148409" clinSig 0.59
1 HAVANA transcript 118568 148419 . + . remap_original_location "1:+:118568-148419" clinSig 0.02 M .
MT HAVANA gene 226 399 . + . remap_original_location "MT:+:226-399" * + 3
MT HAVANA * 27 . -
你知道我怎样才能做到这一点吗

我正在尝试以下代码:

awk '{for(i=1;i<=NF;i++){ if($i=="remap_original_location"){print ??? }}}'

但我不确定如何指定打印部分。此外,正如您所看到的,并非所有行都显示模式重新映射原始位置,但我仍然希望将它们打印出来。

对于您显示的示例,请尝试以下内容

awk '
{
  gsub(/chr/,"")
}
match($0,/remap_original_location "M:/){
  val=substr($0,RSTART,RLENGTH)
  sub(/"M:/,"\"MT:",val)
  $0=substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
1'  Input_file
或者根据Sundeep的评论,也可以尝试以下内容:

awk '{gsub(/chr/,""); sub(/remap_original_location "M/, "&T")} 1' Input_file

有了你们展示的样品,你们能试一下下面的吗

awk '
{
  gsub(/chr/,"")
}
match($0,/remap_original_location "M:/){
  val=substr($0,RSTART,RLENGTH)
  sub(/"M:/,"\"MT:",val)
  $0=substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
1'  Input_file
或者根据Sundeep的评论,也可以尝试以下内容:

awk '{gsub(/chr/,""); sub(/remap_original_location "M/, "&T")} 1' Input_file
您可以使用此awk:

awk'{gsub/chr/,;对于i=1;i您可以使用此awk:

awk'{gsub/chr/,;对于i=1;使用perl时i:

perl-pe's/remap_original_location\KchrM?/$1?MT:/e'ip.txt 重新映射原始位置我假设这里的字段之间只有一个空格,并且下一个字段总是以字符开头。如果需要,可以调整正则表达式的其他变化 \K前面的部分不会是要替换的匹配文本的一部分 M?可选地匹配M字符 $1?MT:如果第一个捕获组不为空,则使用MT作为替换字符串,否则使用空字符串 空字符串在Perl中是错误的 在这种情况下,还可以使用$1&&MT代替三元表达式,因为Falsy值与所需的备用值相同 e标志有助于在替换部分使用Perl代码 使用perl:

perl-pe's/remap_original_location\KchrM?/$1?MT:/e'ip.txt 重新映射原始位置我假设这里的字段之间只有一个空格,并且下一个字段总是以字符开头。如果需要,可以调整正则表达式的其他变化 \K前面的部分不会是要替换的匹配文本的一部分 M?可选地匹配M字符 $1?MT:如果第一个捕获组不为空,则使用MT作为替换字符串,否则使用空字符串 空字符串在Perl中是错误的 在这种情况下,还可以使用$1&&MT代替三元表达式,因为Falsy值与所需的备用值相同 e标志有助于在替换部分使用Perl代码
好主意,但您可以将其简化为awk'{gsub/chr/,;sub/remap_original_location M/,&T}1'@Sundeep,谢谢,将此解决方案添加为具有信用的替代方案,谢谢。好主意,但您可以将其简化为awk'{gsub/chr/,;sub/remap_original_location M/,&T}1'@Sundeep,谢谢,将此解决方案添加为具有信用的替代方案,谢谢。