linux - 使用 linux 查找和替换制表符分隔文件中列中的值

标签 linux perl awk bioinformatics

例如,我有以下数据:

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 是真实条件,因此所有行都被打印出来。

关于linux - 使用 linux 查找和替换制表符分隔文件中列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858651/

相关文章:

perl - 更新终端上的多行 perl 输出

bash - 文件中的列字符串版本,bash sed awk

bash - 使用 awk 基于行和列减少几个大的制表符分隔矩阵

java - 如何在特定的 Java 版本上运行应用程序?

linux - session.serialize_handler 作为 igbinary 导致 "igbinary_unserialize_header: unsupported version"

linux - 在 cpan 之前使用 yum/apt-get 来管理 UNIX 系统范围的 Perl 模块?

linux - 使用bash替换文本文件中的字符串

shell - 查找 2 个字符串之间的所有内容 -- Sed

linux - Linux 上的 Python3 交互模式两次启动代码

linux - bash 脚本将字符串视为命令