使用 linux 查找和替换制表符分隔文件中列中的值
Using linux to find and replace the a value in a column in a tab delimited file
例如,我有以下数据:
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 }' file
并且它会在第一列中找到所有不包含字符串 "rs" 的行,但是我现在如何进一步将其替换为我自己的从 chrom 和位置构建的 rs ID?我会使用 gsub 还是其他东西?这不一定要在 shell 命令中,但 Perl 也是可以使用的另一种选择。谢谢您的帮助。
你可以使用这个命令:
$ awk 'BEGIN{FS=OFS="\t"}NR>1&&!(~/rs/){="rs"}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&&!(~/rs/)
我们过滤不是第一个(header)的行在第一个字段中包含字符串 "rs",使用 {="rs"}
我们将第一个字段的值更改为所需的值。最后的1
是真条件,所以所有的行都被打印出来了。
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
例如,我有以下数据:
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 }' file
并且它会在第一列中找到所有不包含字符串 "rs" 的行,但是我现在如何进一步将其替换为我自己的从 chrom 和位置构建的 rs ID?我会使用 gsub 还是其他东西?这不一定要在 shell 命令中,但 Perl 也是可以使用的另一种选择。谢谢您的帮助。
你可以使用这个命令:
$ awk 'BEGIN{FS=OFS="\t"}NR>1&&!(~/rs/){="rs"}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&&!(~/rs/)
我们过滤不是第一个(header)的行在第一个字段中包含字符串 "rs",使用 {="rs"}
我们将第一个字段的值更改为所需的值。最后的1
是真条件,所以所有的行都被打印出来了。
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