例如,我有以下数据:
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
是真实的条件,因此所有行都被打印出来。