[英]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 $1}' file
它會找到第一列中不包含字符串“rs”的所有行,但是我現在如何進一步將其替換為我自己的基於 chrom 和位置構建的 rs ID? 我會使用 gsub 還是其他東西? 這不必在 shell 命令中,但 Perl 也是另一個可以使用的選項。 感謝您的幫助。
你可以使用這個命令:
$ 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
是真條件,因此所有行都被打印出來。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.