我想在第一个冒号:
(包括)之后删除文本,或者将其替换为空。
例如,1:5:30
应更改为1
。我更喜欢使用awk脚本来完成这项工作。但我不知道该怎么做。你能告诉我任何指示吗?提前谢谢。
我的数据以制表符分隔,文件看起来像某些单元格中有点。
1 313 . T C 30.11 1:5:30 . . .
1 316 . A T 30.80 1:5:30 . 0:8:28 .
1 317 . T A 31.40 1:5:36 . 0:8:28 .
我尝试了以下内容,但是我对所有这些都失败了:
sed 's/:*:*//g' mydatafile
sed 's/:[0-9]:[0-9]//g' mydatafile
答案 0 :(得分:4)
有点不清楚所需的输出应该是什么,但这是我的解释,使用sed
:
$ sed 's/:.*//' input
1 313 . T C 30.11 1
1 316 . A T 30.80 1
1 317 . T A 31.40 1
使用awk:
$ awk -F":" '{print $1}' input
1 313 . T C 30.11 1
1 316 . A T 30.80 1
1 317 . T A 31.40 1
使用剪切:
cut -d":" -f1 input
使用bash:
IFS=':'
while read a b; do
echo $a
done < input
使用awk的替代解释:
$ awk 'BEGIN {OFS="\t"} {sub(/:.*/,"",$7); print}' input
1 313 . T C 30.11 1 . . .
1 316 . A T 30.80 1 . 0:8:28 .
1 317 . T A 31.40 1 . 0:8:28 .
第3次,希望最后一次更新
使用awk进行第3次解释:
$ awk 'BEGIN {OFS="\t"} {for (i=1;i<NF;i++){sub(/:.*/,"",$i)}; print}' input
1 313 . T C 30.11 1 . . .
1 316 . A T 30.80 1 . 0 .
1 317 . T A 31.40 1 . 0 .
答案 1 :(得分:3)
perl -p -e 's/:\d+:\d+//g' mydatafile
答案 2 :(得分:2)
试试这个:
sed 's/\([0-9][0-9]*\):[0-9][0-9]*:[0-9][0-9]*/\1/g' infile
或
sed 's/\([0-9]\{1,\}\):[0-9]\{1,\}:[0-9]\{1,\}/\1/g' infile
<强>输出强>:
1 313 . T C 30.11 1 . . .
1 316 . A T 30.80 1 . 0 .
1 317 . T A 31.40 1 . 0 .
答案 3 :(得分:2)
这是使用sed
的最短的一个:
sed -i.orig 's/\([0-9]\)*:[^ ]*/\1/g' inputfile
这会将原始文件的副本保留为inputfile.orig
。并就地替换文件。
答案 4 :(得分:1)
这应该可以解决问题。
$ sed -e 's/:.*//' mydatafile
1 313 . T C 30.11 1
1 316 . A T 30.80 1
1 317 . T A 31.40 1
我认为sed比awk更容易解决这个问题。
Overview of Regular Expression Syntax
后来。 。
我从您的评论中看到您希望将{{1>}的x:y:z
替换为<{1}}的其他答案。在那种情况下,我会使用这个awk程序。
x