【问题标题】:Remove characters after a specific character in column删除列中特定字符之后的字符
【发布时间】:2015-06-25 02:46:42
【问题描述】:

我有一个文件:

chr12   121164863   +   NM_000017
chr17   7126029-7126037 +   NM_000018
chr11   108004589-108004593 +   NM_000019
chr12   52306964-52306968   +   NM_000020

我想要做的是删除第 2 列中 - 之后的字符以获得所需的输出:

chr12   121164863   +   NM_000017
chr17   7126029 +   NM_000018
chr11   108004589   +   NM_000019
chr12   52306964    +   NM_000020 

关于如何完成此任务的任何建议?我在想 awk 或 sed,但它们很快就变得复杂了。

【问题讨论】:

  • 你能在其他栏目中有-吗?如果是这样,请将其包含在您的示例输入/输出中。您是否关心保留输出中的空白?

标签: unix awk sed


【解决方案1】:

使用 awk 你可以做到

$ awk '{$2+=0}1' file
chr12 121164863 + NM_000017
chr17 7126029 + NM_000018
chr11 108004589 + NM_000019
chr12 52306964 + NM_000020

或者如果您希望它适用于非数字数据:

awk '{split($2,a,/-/);$2=a[1]}1' file

【讨论】:

  • 您能解释一下数值部分的作用吗?这是否意味着“只有第 2 列中的值等于或大于零?
  • @crazysantaclaus:向字符串值添加零会将字符串转换为数字,其中表示的数字从字符串的开头开始,到第一个非数字字符结束。例如尝试awk 'BEGIN{print "123abc" +0}'
【解决方案2】:

这比你想象的要容易:

sed -E 's/-\d+//'

假设你可以做 PCRE,否则:sed -E 's/-[0-9]+//'

或者只使用 perl:

perl -pe 's/-\d+//g'

如果确实需要专门匹配第二个字段,而-出现在别处:

perl -pe 's/^(\w+\s+\d+)-\d+/$1/'

【讨论】:

  • s/-[0-9]+//; 有一个无用的尾随分号,您需要做一些事情来使 + 充当 RE 元字符,或者将 arg 添加到 sed(-r 或 @987654329 @) 或转义它。
  • 嗯,好的。几乎所有事情都倾向于使用perl :)。
  • 我还没有想出 perl 的用途,但我只编程了 35 年,所以我确信它就在拐角处;-)。我确实认为您的 sed 解决方案可能是最好的答案,只需要我提到的那些调整。
  • ... 哦,你可以在 sed、awk、grep、shell 中做的所有事情,以及一些其他的东西,比如面向对象的代码、函数式编程、多线程和并行性。但除此之外,不多。
  • 我知道它可以做什么我只是还没有找到它的用途(而不是在为做那件事而创建的特定工具中做我需要的特定事情)。它似乎确实很受欢迎,所以其他人一定在寻找它的用途。我的部分障碍是它在我使用的许多 UNIX 机器上不可用,即使我想安装它也没有权限,所以我没有很大的动力去研究它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2021-10-28
  • 2020-06-17
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多