删除列中特定字符后的字符

时间:2015-06-24 18:37:06

标签: unix awk sed

我有一个文件:

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,但是他们已经快速复杂了。

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

这比你想象的要容易:

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

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

或者只使用perl:

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

如果您确实需要专门匹配第二个字段,-出现在其他地方:

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