【问题标题】:Using linux to find and replace the a value in a column in a tab delimited file使用linux查找和替换制表符分隔文件中列中的a值
【发布时间】:2017-02-12 23:52:08
【问题描述】:

我有以下数据,例如:

Name  Chrom  Position
rs1    1     1234  
rs2    1     1789   
rs3    1     1289   
1      1     1269   
2      1     1897

我想查找第一列中不包含字符串“rs”的所有行,并替换为rs'chrom''position'。名称 1 看起来像 rs11269

最终会是这样的:

Name  Chrom  Position   
rs1     1     1234  
rs2     1     1789   
rs3     1     1289   
rs11269 1     1269   
rs11897 1     1897

我知道用 awk 我可以做到

awk '!/rs/{print $1}' file

它会在第一列中找到所有不包含字符串“rs”的行,但是我现在如何进一步用我自己的 rs ID 来替换它,这些 rs ID 是由 chrom 和 position 构建的?我会使用 gsub 还是其他东西?这不必在 shell 命令中,但 Perl 也是另一个可以使用的选项。谢谢您的帮助。

【问题讨论】:

  • 已根据您的推荐编辑@EdMorton

标签: linux perl awk bioinformatics


【解决方案1】:

你可以使用这个命令:

$ awk 'BEGIN{FS=OFS="\t"}NR>1&&!($1~/rs/){$1="rs"$2$3}1' file
Name     Chrom  Position
rs1      1      1234
rs2      1      1789
rs3      1      1289
rs11269  1      1269
rs11897  1      1897

使用BEGIN{FS=OFS="\t"},我们将输入和输出字段分隔符设置为制表符,使用NR>1&&!($1~/rs/),我们过滤不是第一个(标题)且第一个字段中不包含字符串“rs”的行,并且使用{$1="rs"$2$3},我们将第一个字段的值更改为所需的值。最后的1 是真条件,所以所有的行都被打印出来了。

【讨论】:

  • 完美!这正是我一直在寻找的。感谢您的帮助。
  • @nub2.0:没问题,很高兴为您提供帮助!
【解决方案2】:

perl 中的解决方案:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Data::Dumper;

my $row;

#   Open file to read.
open (my $FH, '<', 'test') or die ($!);

# Write new updated file.
open (my $OUT, '>', 'updated_test') or die ($!);


while (my $line = <$FH>){
    chomp($line);
    my @val = split( "\t" , $line );

    if ( $val[0] !~  m/rs/ ) { 
        my $row = "rs" . $val[0] . $val[1] . $val[2] . "\t" . $val[1] . "\t" . $val[2];
        print $OUT $row."\n";
    } 
    else{
        print $OUT $line."\n";
    }
}

close $FH;  
close $OUT; 

输出:

Name  Chrom  Position   
rs1     1     1234  
rs2     1     1789   
rs3     1     1289   
rs11269 1     1269   
rs11897 1     1897

【讨论】:

  • 或者作为 Perl 单行:perl -lane '$F[0] = join("", "rs", @F[1..2]) if ($F[0] !~ /^rs/ &amp;&amp; $. != 1); print join("\t", @F)' &lt;inputfile&gt;
猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2015-07-07
  • 2020-08-04
相关资源
最近更新 更多