例如,我有以下数据:

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和position构建的自己的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是真实的条件,因此所有行都被打印出来。

10-05 20:50
查看更多